javascript - MongoDB 聚合查找从 localField 到结果的附加字段
问题描述
我在 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
阶段):
{
$lookup: {
from: "characters",
let: {
members_name: "$members.name",
rank: "$members.rank"
},
pipeline: [
{
$match: {
name: "$$members_name"
}
}
],
as: "tested"
}
}
那么,是否有任何选项可以在阶段之后添加额外的字段$lookup
?
(Mongo -v 4.2.3,所以问题与新语法支持无关)
解决方案
你几乎接近解决它。由于members
是一个数组,因此您需要将其传递给$lookup
每个字符,然后有条件地加入它$reduce
(您也可以这样做$filter
,但我们需要额外的阶段)。
注意: 解释为什么我们需要使用$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"
}
}
])
推荐阅读
- arrays - 在 2 列中查找行,其中 IF AND 在相应行中的这 2 个单元格之间相遇
- java - 在哪里可以找到每个 JDK 版本的最低兼容 JRE 版本是什么?
- java-8 - 从列表中提取两个大小相同的对象
- javascript - webgl2传递属性含义
- javascript - 将多个 Node.js 应用程序限制为具有多个 IPv4 地址的机器上的特定 IP 地址
- api - 如何使用 Microsoft Graph API 从 Microsoft Teams Live 活动会话中导出与会者列表?
- powershell - 如何解析来自 Invoke-WebRequest 的响应
- javascript - 存储更改时 React Redux 不会重新渲染
- c# - 如何在 C# 中从 SSL 证书解码 SCT 列表
- swift - 在哪里可以找到最新的 Movesense Showcase 应用程序源?