在操作类似文档的聚合管道中
{
"availablePackages": [
{
"title": "Silver",
"code": "001",
},
{
"title": "Gold",
"code": "002",
},
{
"title": "Platinum",
"code": "003",
},
"selectedPackageCode": "002"
}
我需要将上述文档中的所有内容替换为代码与selectedPackageCode
相匹配的软件包的标题。所以我想以
{
"packageTitle": "Gold"
}
这不是查找,因为它在当前文档中。我以为我也许可以使用$let
创建一个变量,然后使用$match
找到正确的数组元素,但是我没有找到一种有效的语法。
答案 0 :(得分:0)
您需要$filter来将availablePackages
与selectedPackageCode
和$arrayElemAt进行匹配才能获得第一个匹配元素。为了使其处于一个聚合阶段,您可以使用$let定义临时变量:
db.col.aggregate([
// ... other stages
{
$project: {
packageTitle: {
$let: {
vars: {
selectedPackage: {
$arrayElemAt: [
{ $filter: { input: "$availablePackages", cond: { $eq: [ "$$this.code", "$selectedPackageCode" ] } } }, 0
]
}
},
in: "$$selectedPackage.title"
}
}
}
}
])