在mongodb中编辑子文件NN关系

Eri*_*tra 5 relationship mongoose mongodb async.js subdocument

我有一个应用程序,其中一篇文章可以链接到多个平台.

文章包含平台和平台列表,还包含文章列表.

有关更多详细信息,请查看几个月前我问过的stackoverflow问题.

/sf/answers/2826416841/

问题是如何创建文章和实现文章和平台之间的NN关系.

我有创建文章和删除文章设置,以便列表在平台中更新.

如何实现编辑文章,以便更新哪些平台链接到文章?

为了创建和编辑链接平台,我使用下拉菜单,其中可以选择多个选项.必要的代码可以在先前链接的问题中找到.

vla*_*zam 5

根据您提供的信息,我会建议两种可能的方法,从同一个基础开始:

使用两个集合(文章和平台)并仅在文章文档中定义的数组中存储对平台文档的引用

如果符合以下条件我会推荐

  • 您对文章文档以及平台都有很高的基数
  • 您希望能够独立管理两个实体,同时还可以同步它们之间的引用

    // articles collection schema
    {
    "_id": ...,
    "title": "I am an article",
    
    ...
    
    "platforms": [ "platform_1", "platform_2", "platform_3" ],
    ...
    }
    
    
    // platforms collection schema    
    {
    "_id": "platform_1",
    "name": "Platform 1",
    "url": "http://right/here",
    ...
    },
    
    {
    "_id": "platform_2",
    "name": "Platform 2",
    "url": "http://right/here",
    ...
    },
    
    {
    "_id": "platform_3",
    "name": "Platform 3",
    "url": "http://right/here",
    ...
    }
    
    Run Code Online (Sandbox Code Playgroud)

即使这种方法非常灵活,也需要付出代价 - 如果您需要文章和平台数据,则必须向MongoDB实例发出更多查询,因为数据分为两个不同的集合.

例如,在加载文章页面时,考虑到您还想显示列表platforms,您必须向其发出查询articles collection,然后触发搜索platforms collection以检索该文章发布的所有平台实体通过platforms数组的成员article document.

但是,如果您只有一小部分经常访问的子集platform attributes,您需要在加载时可用,除了对平台文档的引用之外article document,您可以增强存储这些属性的platforms数组:articles collection_id

// enhanced articles collection schema  
{
"_id": ...,
"title": "I am an article",

...

"platforms": [
    {platform_id: "platform_1", name: "Platform 1"},
    {platform_id: "platform_2", name: "Platform 2"},
    {platform_id: "platform_3", name: "Platform 3"}
],

...
Run Code Online (Sandbox Code Playgroud)

}

如果platform data attributes您经常检索以与文章特定数据一起显示的内容不经常更改,那么这种混合方法将是合适的.

否则,你将不得不被对所做的所有更新同步platform document attributesplatforms collection与您跟踪的平台数组文章文件的一部分属性的子集.

关于单个平台的文章列表的管理,我不建议在两个集合中存储N对N引用,因为上述机制已经允许您通过查询articles collection使用具有以下_id值的查找查询来提取文章列表platform document:

Approach #1
db.articles.find({"platforms": "platform_1"});

Approach #2:
db.articles.find({"platforms.platform_id": "platform_1"});
Run Code Online (Sandbox Code Playgroud)

提出了两种不同的方法,我现在建议您分析应用程序的查询模式和性能阈值,并根据您遇到的方案做出计算决策.