mongodb - MongoDB动态子字段名称
问题描述
我有一个像这样的文件:
{
idx: {a: 1, b: 2, c: 3},
v: "a"
}
在聚合查询中,我想x
通过获取 的值v
并使用它在idx
. 生成的文档如下所示:
{
idx: {a: 1, b: 2, c: 3},
v: "a",
x: 1
}
我已经尝试过类似的东西$addFields: {x: "$idx.$a"}
,$addFields: {x: "$idx[$a]"}
但这些都不起作用。我已经扫描了管道运营商的名单,但没有看到任何有用的信息。这可能吗?
解决方案
没有简单的方法,但您可以利用$objectToArray运算符获取idx
键和值的数组,然后使用$filter和$arrayElemAt来获取匹配的元素。
db.collection.aggregate([
{
$addFields: {
x: {
$let: {
vars: {
match: {
$arrayElemAt: [
{ $filter: { input: { $objectToArray: "$idx" }, cond: { $eq: [ "$$this.k", "$v" ] } } },
0
]
}
},
in: "$$match.v"
}
}
}
}
])
推荐阅读
- api - Flutter:如何使用 Http.Client 删除 Rest Api?
- laravel - Laravel 分页 & 获取所有
- python - 如何向函数内部分布和定义的张量流图添加操作?
- botframework - MS Teams 中的布局视图与 Webchat 控制台中的 Azure 门户测试完全不同,我该如何解决?
- c++ - 不能将超过 32 位的 char 移位为 unsigned long long
- javascript - Bootstrap datePicker(仅限月份和年份)不会正确显示
- sql - Pyspark 中的解码替代品
- reactjs - 使用代理时,React 应用程序正在寻找不同位置的静态文件
- typescript - 使用 mockResolvedValueOnce 和 async/await 时抛出 tslint 警告
- r - 标签太长,无法放入条形区域