sql >> Database teknologi >  >> NoSQL >> MongoDB

Hvordan forespørges træstruktur rekursivt med MongoDB?

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.




  1. Opdater objekt inde i arrayet i mongoDb ved hjælp af mongoose

  2. MongoDB $strLenBytes

  3. mongoDB:$inc af et ikke-eksisterende dokument i et array

  4. Bruger du MongoDB vs MySQL med mange JSON-felter?