sql >> Databasteknik >  >> NoSQL >> MongoDB

Hur frågar man trädstrukturen rekursivt med MongoDB?

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.




  1. MongoDB förladda dokument i RAM för bättre prestanda

  2. DigitalOcean pod har obundna omedelbara PersistentVolumeClaims

  3. Hur frågar man trädstrukturen rekursivt med MongoDB?

  4. Asp.net kärnwebb-API med mongodb 500-fel