2011-12-17 28 views
6

Necesito almacenar una estructura de árbol recursiva. Una lista enlazada.
Entonces todos los objetos son iguales. Cada uno tiene un puntero a un objeto principal y cada uno tiene una matriz de objetos secundarios.
¿Puedo guardar una estructura así en Mongo?
es decir, una colección Mongo de objetos padre, cada objeto contiene dentro de ella una colección Mongo de objetos secundarios.¿Puede una colección MongoDB tener dentro otra colección?

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

Respuesta

3

No puede almacenar colecciones en colecciones. Pero puede almacenar identificadores que hacen referencia a objetos en otras colecciones. Tendría que resolver el ID del documento o elemento y luego, si ese elemento almacena más identificadores, deberá resolverlos una y otra vez. Los documentos están destinados a ser rica y duplicar datos, pero en los documentos ellos explican que en lugar de incrustar sólo puede utilizar los identificadores de

5

MongoDB puede almacenar subdocumentos:

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

Sin embargo, no recomiendo usar subdocumentos para estructuras de árbol o cualquier cosa que sea bastante compleja. Los subdocumentos no son ciudadanos de primer nivel; no son elementos de colección.

Por ejemplo, supongamos que desea poder encontrar rápidamente los nodos con un valor determinado. A través de un índice en value, esa búsqueda sería rápida. Sin embargo, si el valor está en un subdocumento, no se indexará porque no es el valor de un elemento de colección.

Por lo tanto, por lo general es mejor hacer la serialización de forma manual y almacenar una lista de identificadores de lugar:

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

Vas a tener que hacer algo de la serialización de forma manual a buscar los identificadores del elemento respectivo.

Sugerencia Supongamos que quiere buscar una rama entera del árbol. En lugar de almacenar sólo el ID de padre directa, puede almacenar todos ancestro ids lugar:

"ancestorIds": [id1, id2, id3]

Cuestiones relacionadas