sql >> Database >  >> NoSQL >> MongoDB

Hoe de boomstructuur recursief opvragen met MongoDB?

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.




  1. Een SQL LIKE-instructie gebruiken in MongoDB

  2. Sleutels zoeken met jokertekens

  3. Hoe mongodb te ondervragen met de voorwaarde "like" in symfony2

  4. klassen en interfaces om getypte modellen en schema's van Mongoose in Typescript te schrijven met behulp van suretyped