2011-12-17 21 views
6

Potrzebuję przechowywać rekurencyjną strukturę drzewa. Połączona lista.
Wszystkie obiekty są takie same. Każdy ma wskaźnik do obiektu nadrzędnego, a każdy ma tablicę obiektów podrzędnych.
Czy mogę przechowywać taką strukturę w Mongo?
tj. Zbiór obiektów macierzystych Mongo, każdy obiekt zawiera w sobie kolekcję obiektów podrzędnych Mongo.Czy kolekcja MongoDB może mieć w sobie inną kolekcję?

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

Odpowiedz

3

Nie możesz przechowywać kolekcji w kolekcjach. Ale możesz przechowywać identyfikatory, które odwołują się do obiektów w innych kolekcjach. Będziesz musiał rozwiązać identyfikator do dokumentu lub elementu, a następnie, jeśli ten element będzie przechowywać więcej identyfikatorów, będziesz musiał rozwiązać te problemy. Dokumenty mają być bogaty i duplikować dane, ale w docs one nie wyjaśniają, że zamiast osadzania można po prostu użyć identyfikatory

5

MongoDB mogą przechowywać Dokumenty podrzędne:

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

Jednak nie polecam używać poddokumenty dla struktur drzewiastych lub czegoś, co jest dość skomplikowane. Poddokumenty nie są obywatelami pierwszego poziomu; nie są przedmiotami kolekcji.

Załóżmy na przykład, że chcesz szybko znaleźć węzły o zadanej wartości. Dzięki indeksowi pod numerem value wyszukiwanie to byłoby szybkie. Jeśli jednak wartość znajduje się w poddokumentach, nie będzie ona indeksowana, ponieważ nie jest wartością elementu kolekcji.

Dlatego to zwykle lepiej zrobić serializacji ręcznie i zapisać listę identyfikatorów zamiast:

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

Będziesz musiał zrobić kilka serializacji ręcznie pobrać identyfikatory danego elementu.

Wskazówka Załóżmy, że chcesz pobrać całą gałąź drzewa. Zamiast przechowywać tylko bezpośrednie id rodzica, można przechowywać wszystko przodek ids zamiast:

"ancestorIds": [id1, id2, id3]

Powiązane problemy