MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Wie kann man die Baumstruktur rekursiv mit MongoDB abfragen?

Abhängig von Ihrem Anwendungsfall MongoDB v3.4 bietet eine Aggregationspipeline Operator namens $graphLookup . Der Aggregationsoperator kann eine rekursive Suche in einer Sammlung durchführen. Weitere Definitionen finden Sie unter $graphLookup-Definition .

Wenn Sie Ihre Dokumentenhierarchie und die obigen Werte als Beispiele verwenden, könnten Sie versuchen, die folgende Aggregation auszuführen:

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

Das obige sollte das folgende Ergebnis zurückgeben:

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

Wenn Sie jedoch eine große Sammlung haben, ist die obige Abfrage möglicherweise nicht leistungsfähig, da Sie $unwind auf jedem Dokument und können keine Indizes verwenden. Wie von anderen vorgeschlagen, sollten Sie Ihre Dokumentmodellstruktur überdenken. Siehe Baumstrukturen von Datenmodellen . Optimieren Sie basierend auf Ihrer Anwendungslogik und Ihrem Abfrageanwendungsfall und lassen Sie das flexible Dokumentschema folgen.