2011-12-17 2 views
6

Мне нужно сохранить рекурсивную древовидную структуру. Связанный список.
Итак, все объекты одинаковы. Каждый из них имеет указатель на родительский объект, и каждый из них имеет массив дочерних объектов.
Могу ли я хранить такую ​​структуру в Монго.
т. Е. Монгольская коллекция родительских объектов, каждый объект удерживает в ней коллекцию дочерних объектов Mongo.Может ли коллекция MongoDB иметь в ней еще одну коллекцию?

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

ответ

3

Вы не можете хранить коллекции в коллекциях. Но вы можете хранить идентификаторы, ссылающиеся на объекты в других коллекциях. Вам придется разрешить идентификатор документа или элемента, а затем, если этот элемент хранит больше идентификаторов, вам необходимо будет разрешить их. Документы предназначены, чтобы быть богатыми и дублировать данные, но в документации они объясняют, что вместо вложения вы можете просто использовать идентификаторы

5

MongoDB может хранить поддокументы:

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

Однако я не рекомендую использовать поддокументы для древовидных структур или что-то довольно сложное. Поддокументы не являются гражданами первого уровня; они не являются элементами коллекции.

Например, предположим, что вы хотели бы быстро найти узлы с заданным значением. Через индекс на value этот поиск будет быстрым. Однако, если значение находится в поддокументе, оно не будет индексироваться, потому что это не значение элемента коллекции.

Поэтому, как правило, лучше делать сериализацию вручную и сохранить список идентификаторов вместо:

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

Вам придется сделать некоторые сериализации вручную для извлечения идентификаторов соответствующего элемента.

Подсказка Предположим, вы хотите получить всю ветвь дерева. Вместо того, чтобы хранить только прямой родительский идентификатор, вы можете хранить все предок Идентификаторы вместо:

"ancestorIds": [id1, id2, id3]