2011-12-17 22 views
6

Ho bisogno di memorizzare una struttura ad albero ricorsivo. Una lista collegata.
Quindi tutti gli oggetti sono uguali. Ognuno ha un puntatore a un oggetto padre e ognuno ha una matrice di oggetti figlio.
Posso memorizzare una tale struttura in Mongo.
Ad esempio, una raccolta Mongo di oggetti padre, ogni oggetto contiene al suo interno una raccolta Mongo di oggetti figlio.Una raccolta MongoDB può contenere al suo interno un'altra raccolta?

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

risposta

3

Non puoi archiviare le raccolte nelle raccolte. Ma puoi memorizzare id che fanno riferimento a oggetti in altre raccolte. Dovresti risolvere l'id per il documento o l'elemento e poi se quell'elemento memorizza più id devi risolverli in continuazione. I documenti sono destinate ad essere ricco e duplicare i dati, ma nei documenti che spiegano che, invece di incorporare si può semplicemente utilizzare gli ID

5

MongoDB può memorizzare documenti secondari:

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

Comunque, io non consiglio di utilizzare documenti secondari per strutture ad albero o tutto ciò che è piuttosto complesso. I documenti secondari non sono cittadini di primo livello; non sono oggetti da collezione.

Ad esempio, si supponga di voler essere in grado di trovare rapidamente i nodi con un determinato valore. Attraverso un indice su value, tale ricerca sarebbe veloce. Tuttavia, se il valore è in un documento secondario, non verrà indicizzato perché non è un valore di un elemento di raccolta.

Pertanto, di solito è meglio fare la serializzazione manualmente e memorizzare un elenco di ID invece:

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

Dovrete fare manualmente alcuni dei serializzazione per andare a prendere gli ID del rispettivo elemento.

Suggerimento Supponiamo di voler recuperare un intero ramo dell'albero. Invece di memorizzare solo l'ID controllante diretta, è possibile memorizzare tutti antenato ids invece:

"ancestorIds": [id1, id2, id3]

Problemi correlati