2017-09-06 7 views
1

ich eine Baumstruktur haben so aussehenMongoDB rekursive Suche nach Array von Objekten

{ 
    "_id" : ObjectId("59aebe21f002a8556ca78310"), 
    "fid" : ObjectId("59aebe216b96002252a89d7b"), 
    "pr" : [ 

    ], 
    "ch" : [ 
     { 
      "_id" : ObjectId("59aebe326b96002252a89d7d"), 
      "trashed" : false 
     }, 
     { 
      "_id" : ObjectId("59aebe376b96002252a89d7f"), 
      "trashed" : false 
     } 
    ] 
} 
{ 
    "_id" : ObjectId("59aebe33f002a8556ca78347"), 
    "fid" : ObjectId("59aebe326b96002252a89d7d"), 
    "pr" : [ 
     { 
      "_id" : ObjectId("59aebe216b96002252a89d7b"), 
      "trashed" : false 
     } 
    ], 
    "ch" : [ 
     { 
      "_id" : ObjectId("59aebe3b6b96002252a89d81"), 
      "trashed" : false 
     } 
    ] 
} 

der fid ist ein Ordner-ID und die ch die Kinder des Ordners ist, so möchte ich ein tun rekursive Suche, um den Baum der Ordner und Dateien zu erhalten. In meinem Fall habe ich ein $graphLookup verwendet eine rekursive Suche zu tun, sondern als Ergebnis erhalte ich andere Ordner zu

pipeline := []bson.M{ 
     {"$match": bson.M{"fid": id}}, 
     {"$graphLookup": bson.M{ 
      "from":    "tree", 
      "startWith":  "$fid", 
      "connectFromField": "fid", 
      "connectToField": "ch._id", 
      "as":    "parents", 
     }}, 
     {"$match": bson.M{"ch.trashed": false}}, 
    } 

    Connection.Session.DB("cctv_storage").C("tree").Pipe(pipeline).All(&tData) 

Mein Projekt basiert auf Golang.

+0

Bitte lesen Sie, wie '$ graphLookup' funktioniert: https://docs.mongodb.com/manual/reference/operator/aggregation/graphLookup/ Wenn" connectToField ":" ch._id " '' '' '' sollte wirklich "Kinder" sein, nicht "Eltern". Das zweite '$ match' filtert nur die Dokumente der obersten Ebene, nicht alle Kinder/Eltern. Außerdem haben alle Dokumente im Beispiel "ch.trashed": false. –

Antwort

1

Ich glaube, Sie $unwind für den ersten Einsatz müssen, als $graphLookup, so benötigen Sie eine rekursive Suche ähnliche So als Folge

var tData struct { 
     Id bson.ObjectId  `bson:"_id"` 
     Child [][]bson.ObjectId `bson:"child"` 
    } 

pipeline := []bson.M{ 
     {"$unwind": bson.M{ 
      "path": "$pr", 
      "preserveNullAndEmptyArrays": true, 
     }}, 
     {"$graphLookup": bson.M{ 
      "from":    "tree", 
      "startWith":  "$fid", 
      "connectFromField": "fid", 
      "connectToField": "pr._id", 
      "as":    "child", 
     }}, 
     {"$match": bson.M{"fid": id}}, 
     {"$group": bson.M{"_id": id, "child": bson.M{"$addToSet": "$child.fid"}}}, 
    } 
Connection.Session.DB("cctv_storage").C("tree").Pipe(pipeline).One(&tData) 

aussehen zu tun, werden Sie die id des Stammordner erhalten und die IDs von Kinder

Verwandte Themen