Afhankelijk van uw gebruikssituatie, MongoDB v3.4 biedt een aggregatiepijplijn operator genaamd $graphLookup . De aggregatie-operator kan recursief zoeken op een collectie. Zie meer definitie op $graphLookup-definitie .
Als u uw documenthiërarchie en waarden hierboven als voorbeelden gebruikt, kunt u proberen onderstaande aggregatie uit te voeren:
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"}
}}
]);
Het bovenstaande zou het onderstaande resultaat moeten opleveren:
{ "_id" : 7, "parents" : [ [ 1, 2, 4 ] ] }
Dat gezegd hebbende, als je een grote verzameling hebt, is de bovenstaande zoekopdracht mogelijk niet effectief omdat je $unwind op elk document en kunnen geen indexen gebruiken. Zoals door anderen is gesuggereerd, moet u de structuur van uw documentmodel opnieuw overwegen. Zie Gegevensmodellen Boomstructuren . Optimaliseer op basis van uw toepassingslogica en het uitvoeren van query's, en laat het flexibele documentschema volgen.