sql >> Databáze >  >> NoSQL >> MongoDB

Jak se dotazovat na stromovou strukturu rekurzivně pomocí MongoDB?

V závislosti na vašem případu použití MongoDB v3.4 poskytuje agregační kanál operátor s názvem $graphLookup . Operátor agregace je schopen provádět rekurzivní vyhledávání v kolekci. Další definice naleznete v definici $graphLookup .

Pomocí výše uvedené hierarchie dokumentů a hodnot můžete zkusit spustit agregaci pod:

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"}
                  }}
]);

Výše uvedené by mělo vrátit výsledek jako níže:

{ "_id" : 7, "parents" : [ [ 1, 2, 4 ] ] }

Pokud však máte velkou sbírku, výše uvedený dotaz nemusí být výkonný, protože budete provádět $unwind na každém dokumentu a nebude možné používat indexy. Jak navrhují ostatní, měli byste znovu zvážit strukturu modelu dokumentu. Viz Stromové struktury datových modelů . Optimalizujte na základě vaší aplikační logiky a případu použití dotazování a nechte flexibilní schéma dokumentu následovat.




  1. Vysvětlení data JSON

  2. vytvořit nadřazený objekt, který vnořil děti do mongoose

  3. MongoDB $replaceAll

  4. Aktualizujte více dokumentů ATOMICKY A vraťte je