Afhængigt af din use case, MongoDB v3.4 leverer en aggregeringspipeline operatør kaldet $graphLookup . Aggregeringsoperatøren er i stand til at udføre en rekursiv søgning på en samling. Se mere definition på $graphLookup definition .
Ved at bruge dit dokumenthierarki og værdier ovenfor som eksempler, kan du prøve at køre under aggregering:
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"}
}}
]);
Ovenstående skulle returnere resultatet som nedenfor:
{ "_id" : 7, "parents" : [ [ 1, 2, 4 ] ] }
Når det er sagt, hvis du har en stor samling, er ovenstående forespørgsel muligvis ikke effektiv, da du vil udføre $unwind på hvert dokument og vil ikke være i stand til at bruge indekser. Som foreslået af andre, bør du genoverveje din dokumentmodelstruktur. Se Datamodellers træstrukturer . Optimer baseret på din applikationslogik og forespørgselsanvendelse, og lad det fleksible dokumentskema følge med.