2011-12-17 111 views
6

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

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

回答

3

您不能在集合中存储集合。但是您可以存储引用其他集合中的对象的id。您必须将id解析为文档或元素,然后如果该元素存储更多的id,您需要先解决这些id。文件是为了丰富和重复的数据,但在文档他们解释,而不是嵌入你可以只使用IDS

5

MongoDB的可存储子文档:

Node 
{ 
    "value" : "root" 
    "children" : [ { "value" : "child1", "children" : [ ... ] }, 
        { "value" : "child2", "children" : [ ... ] } ] 
} 

不过,我不建议使用树结构的子文档或任何相当复杂的东西。子文件不是一级公民;他们不是收集物品。

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

因此,它通常是更好地做手工序列化和存储ID的列表,而不是:

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

你必须手动做一些序列化来获取相应的元素的IDS。

提示 假设您想获取树的整个分支。相反,仅存储直接父ID,可以存储所有祖先ID,而不是:

"ancestorIds": [id1, id2, id3]