我有一个像这样的树形结构

{
    "_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
        }
    ]
}

fid 是文件夹ID,而 ch 是Folder的子代,因此我想进行递归搜索以获取文件夹和文件的树。
就我而言,我使用了$graphLookup进行递归搜索,但结果也得到了其他文件夹
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)

我的项目基于Golang。

最佳答案

我认为您首先需要使用$unwind而不是$graphLookup,因此您需要像这样进行递归搜索

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)

因此,您将获得根文件夹的 id 子项的ID

关于mongodb - Mongodb递归搜索对象数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46069871/

10-11 05:04