【问题标题】:editing subdocments N-N relationship in mongodb在 mongodb 中编辑子文档 N-N 关系
【发布时间】:2017-06-27 15:34:33
【问题描述】:

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

文章包含平台列表,平台也包含文章列表。

有关更多详细信息,请查看我几个月前提出的这个 stackoverflow 问题。

https://stackoverflow.com/a/40377383/5770147

问题是关于如何创建文章并实现文章和平台之间的 N-N 关系。

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

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

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

【问题讨论】:

  • @chridam 看到之前的解决方案来自你,你对如何实现这个有任何想法

标签: mongodb mongoose relationship async.js subdocument


【解决方案1】:

根据您提供的信息,我会推荐两种可能的方法,从相同的基础开始:

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

如果出现以下情况,我会推荐这种方法:

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

    // 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",
    ...
    }
    

即使这种方法非常灵活,但也是有代价的 - 如果您需要文章和平台数据,您将不得不对您的 MongoDB 实例发起更多查询,因为数据分为两个不同的集合。

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

但是,如果在加载article document 时只有一小部分经常访问的platform attributes 可用,则可以增强articles collection 上的platforms 数组以另外存储这些属性对_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"}
],

...

}

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

否则,您必须将对 platforms collection 中的 platform document attributes 所做的所有更新与作为文章文档平台数组的一部分跟踪的属性子集同步。

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

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

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

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

【讨论】:

  • 所以我可以从平台架构中删除文章列表,然后在平台内查找文章时使用您使用的第二种方法
  • 完全正确 - 即使您要存储每个平台的文章引用列表,您仍然需要使用来自平台的引用对文章集合执行查询以提取这些文章的详细信息文档作为搜索谓词
  • @ErikWestra 您是否设法实现了这种模式?它在您的特定用例中表现如何?
  • 您好,最近两周有一个项目优先于这个,所以我能够专注于这个,现在我开始实施这个版本。我唯一的问题是在所有平台都显示每个平台相关文章计数器的页面上。对我来说,这似乎是一个繁重的查询。
猜你喜欢
  • 2012-11-15
  • 2022-09-23
  • 2021-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-25
  • 2017-04-12
  • 1970-01-01
相关资源
最近更新 更多