MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Come interrogare la struttura ad albero in modo ricorsivo con MongoDB?

A seconda del caso d'uso, MongoDB v3.4 fornisce una pipeline di aggregazione operatore chiamato $graphLookup . L'operatore di aggregazione è in grado di eseguire una ricerca ricorsiva su una raccolta. Vedi più definizione su Definizione di $graphLookup .

Utilizzando la gerarchia dei documenti e i valori sopra come esempi, potresti provare a eseguire l'aggregazione di seguito:

db.collectionName.aggregate([

                {$unwind:{
                        path:"$childrenIdList", 
                        preserveNullAndEmptyArrays: true}
                  }, 
                {$graphLookup:{
                        from:"collectionName", 
                        startWith:"$_id", 
                        connectFromField:"_id", 
                        connectToField:"childrenIdList", 
                        as:"myparents",  
                        restrictSearchWithMatch: {"_id"}}
                  }, 
                {$match: {"_id": 7 } },
                {$group:{
                        _id:"$_id", 
                        parents:{$addToSet:"$myparents._id"}
                  }}
]);

Quanto sopra dovrebbe restituire il risultato come di seguito:

{ "_id" : 7, "parents" : [ [ 1, 2, 4 ] ] }

Detto questo, se disponi di una raccolta di grandi dimensioni, la query di cui sopra potrebbe non essere efficiente poiché eseguirai $unwind su ogni documento e non sarà in grado di utilizzare gli indici. Come suggerito da altri, dovresti riconsiderare la struttura del tuo modello di documento. Vedere Strutture ad albero dei modelli di dati . Ottimizza in base alla logica dell'applicazione e al caso d'uso delle query e lascia che lo schema del documento flessibile segua.