Может ли коллекция MongoDB иметь внутри другую коллекцию? - PullRequest
10 голосов
/ 18 декабря 2011

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

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

Ответы [ 2 ]

7 голосов
/ 18 декабря 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]

6 голосов
/ 18 декабря 2011

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

...