MongoDB 集合中可以包含另一个集合吗?

Posted

技术标签:

【中文标题】MongoDB 集合中可以包含另一个集合吗?【英文标题】:Can a MongoDB collection have inside it another collection? 【发布时间】:2012-01-22 18:57:06 【问题描述】:

我需要存储一个递归树结构。一个链表。 所以所有的对象都是一样的。每个都有一个指向父对象的指针,每个都有一个子对象数组。 我可以在 Mongo 中存储这样的结构吗? 即父对象的 Mongo 集合,每个对象在其中包含子对象的 Mongo 集合。

$a = $MyCollection->findOne(**some conditions)->Childs->find(...)

【问题讨论】:

【参考方案1】:

您不能将集合存储在集合中。但是您可以将引用对象的 id 存储在其他集合中。您必须将 id 解析为文档或元素,然后如果该元素存储更多 id,您将需要不断地解析这些 id。文档意味着丰富且重复的数据,但在文档中他们确实解释说,您可以使用 id 而不是嵌入

【讨论】:

【参考方案2】:

MongoDB 可以存储子文档:

Node

    "value" : "root"
    "children" : [  "value" : "child1", "children" : [ ... ] , 
                    "value" : "child2", "children" : [ ... ]  ]

但是,我不建议将子文档用于树结构或任何相当复杂的东西。子文件不是一级公民;它们不是收藏品。

例如,假设您希望能够快速找到具有给定值的节点。通过value 上的索引,查找会很快。但是,如果值在子文档中,则不会被索引,因为它不是集合元素的值。

因此,通常最好手动进行序列化并存储 id 列表:

Node 

  "_id" : ObjectId("..."),
  "parentId" : ObjectId("..."), // or null, for root

您必须手动进行一些序列化以获取相应元素的 ID。

提示 假设您要获取树的整个分支。您可以存储 所有 祖先 id,而不是只存储直接​​父 id:

"ancestorIds": [id1, id2, id3]

【讨论】:

以上是关于MongoDB 集合中可以包含另一个集合吗?的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB 显示所有集合中的所有内容

mongo 的 MR 可以将结果写入另一个分片集合吗?

spring mongodb - 排序嵌套集合字段

MongoDB:几个问题

使用spring boot将大量数据从一个集合复制到Mongodb中的另一个集合

MongoDB:基于另一个集合从一个集合中选择