2017-01-09 2 views
1

Zum Beispiel eine Baumstruktur als;Wie Baumstruktur rekursiv mit MongoDB abfragen?

[ 
    {id: 1 , childrenIdList: [2, 3]}, 
    {id: 2 , childrenIdList: [4, 5]}, 
    {id: 3 , childrenIdList: []}, 
    {id: 4 , childrenIdList: [6, 7]}, 
    {id: 5 , childrenIdList: []}, 
    {id: 6 , childrenIdList: []}, 
    {id: 7 , childrenIdList: []} 
] 

was ist wie;

Wie kann ich den Baum vom Start des Blattknotens (id = 7) bis zum Stamm (id = 1) verfolgen?

Finden der Eltern von id=7 ist einfach wie;

db.document.find({childrenList: { $in: [7]}}, {id: 1}).toArray(function(err), result{ 
    /*result gives 
    {"id" : NumberInt(4)} 
    now I should look the parent of id=4, and parent of id=2 as you know. 
    */ 
}) 

Sind rekursive Abfragen auf mongodb möglich? Wie kann ich es implementieren?

+0

Sehen Sie sich Graphdaten an: https://www.compose.com/articles/graph-data-with-mongodb/ – Zlatko

Antwort

4

Je nach Anwendungsfall verfügt MongoDB v3.4 über einen aggregation pipeline-Operator namens $graphLookup. Der Aggregationsoperator kann eine rekursive Suche in einer Sammlung durchführen. Siehe mehr Definition auf $graphLookup definition.

Ihre Dokumente Hierarchie und Werte unter Verwendung der oben als Beispiele könnten Sie laufen unter Aggregation versuchen:

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

Die oben sollte wie unten Rück Ergebnis:

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

Having said that Wenn Sie eine große Sammlung haben, ist die obige Abfrage möglicherweise nicht performant, da Sie auf jedem Dokument $unwind ausführen und nicht in der Lage sein werden Indizes verwenden. Wie von anderen vorgeschlagen, sollten Sie Ihre Dokumentmodellstruktur erneut in Betracht ziehen. Siehe Data Models Tree Structures. Optimieren Sie basierend auf Ihrer Anwendungslogik und der Abfrage des Anwendungsfalls und lassen Sie das flexible Dokumentschema folgen.

0

Rekursive Abfrage ist nicht möglich, Sie müssen es codieren, um find rekursiv in Ihrem Code aufzurufen. Alternativ können Sie Ihr Schema so umgestalten, dass die übergeordnete ID in untergeordnete Elemente oder alle Vorfahren als Array oder materialisierter Pfad enthalten sind.

Weitere Informationen finden Sie in der , die bereits von MongoDB für baumstrukturierte Daten bereitgestellt wird.