Может ли коллекция MongoDB иметь внутри другую коллекцию?

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

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

person Itay Moav -Malimovka    schedule 17.12.2011    source источник


Ответы (2)


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

person jdi    schedule 17.12.2011

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]

person mnemosyn    schedule 17.12.2011