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.