Beroende på ditt användningsfall, MongoDB v3.4 tillhandahåller en aggregationspipeline operatör som heter $graphLookup . Aggregeringsoperatorn kan utföra en rekursiv sökning på en samling. Se mer definition på $graphLookup definition .
Med hjälp av dokumenthierarkin och värdena ovan som exempel kan du prova att köra 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"}
}}
]);
Ovanstående bör returnera resultatet enligt nedan:
{ "_id" : 7, "parents" : [ [ 1, 2, 4 ] ] }
Med det sagt, om du har en stor samling kanske ovanstående fråga inte fungerar eftersom du kommer att utföra $unwind på varje dokument och kommer inte att kunna använda index. Som andra har föreslagit bör du ompröva din dokumentmodellstruktur. Se Datamodellers trädstrukturer . Optimera baserat på din applikationslogik och frågefall, och låt det flexibla dokumentschemat följa.