gpt4 book ai didi

Mongodb递归搜索对象数组

转载 作者:IT王子 更新时间:2023-10-29 02:11:21 25 4
gpt4 key购买 nike

我有一个像这样的树结构

{ 
"_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 是文件夹的子项,因此我想进行递归搜索以获取文件夹和文件的树。在我的例子中,我使用了一个 $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)

因此,您将获得根文件夹的 idchildren

的 id

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com