我在MongoDB(mongoplayground)[characters
,guilds
]中有以下集合
我要创建一个$lookup
,它将在生成的文档中添加rank
字段,如下所示:
"members_t": [
{
"_id": ObjectId("5a934e000102030405000000"),
"level": 20,
"name": "test1",
"rank": 1
},
{
"_id": ObjectId("5a934e000102030405000001"),
"level": 40,
"name": "test2",
"rank": 2
}
]
旧的$lookup
语法对此无济于事,但是以下使用新语法的查询在tested
字段中向我返回了一个空数组(即使没有$addFields
阶段):< / p>
{
$lookup: {
from: "characters",
let: {
members_name: "$members.name",
rank: "$members.rank"
},
pipeline: [
{
$match: {
name: "$$members_name"
}
}
],
as: "tested"
}
}
那么,是否可以选择在$lookup
之后添加一个附加字段?
(Mongo -v 4.2.3,因此该问题与新语法支持无关)
答案 0 :(得分:1)
您几乎快要解决它了。由于members
是一个数组,因此您需要将其传递给$lookup
,然后按条件将每个字符与$reduce
连接起来(也可以对$filter
进行此操作,但是接下来我们需要调整阶段。
注意: Explanation为什么需要在$expr
管道内使用$lookup
。
尝试这个:
db.guilds.aggregate([
{
$lookup: {
from: "characters",
let: {
members: "$members"
},
pipeline: [
{
$match: {
$expr: {
$in: [
"$name",
"$$members.name"
]
}
}
},
{
$addFields: {
rank: {
$reduce: {
input: "$$members",
initialValue: null,
in: {
$cond: [
{
$eq: [
"$$this.name",
"$name"
]
},
"$$this.rank",
"$$value"
]
}
}
}
}
}
],
as: "members_t"
}
}
])