mongodb - mongodb聚合:如果两个字段的值匹配,则将对应字典的另一个字段的值添加到新字段中
问题描述
在三个集合中使用聚合查找后,我得到以下结果。
[{
_id : "henten",
location: "some place",
devices: [
{"d_id": 'd0001',
"z_id": 'z2001'},
{"d_id": 'd0002',
"z_id": 'z2002'}
],
store: [
{"z_name" : 'vera',
"z_id" : 'z2001'},
{"z_name" : 'ghora',
"z_id" : 'z2002'}
]
}]
如果devices.z_id 与store.z_id 匹配,我需要将'd_id' 的值作为数组推送到'store' 的字典中到名为'DID' 的新字段中。
我尝试了以下方法:
{
$addFields: {
"store.DID" :
{$filter: {
input: "$devices.d_id",
as: 'did',
cond: {$eq: ['$devices.z_id', '$store.z_id']}
}}
}}
我也尝试过 $redact 和 $arrayElemAt 这给了我相同的错误结果,如下所示:
[{
_id : "henten",
location: "some place",
devices: [
{"d_id": 'd0001',
"z_id": 'z2001'},
{"d_id": 'd0002',
"z_id": 'z2002'}
],
store: [
{"z_name" : 'vera',
"z_id" : 'z2001',
"DID" : ['d0001', 'd0002']},
{"z_name" : 'ghora',
"z_id" : 'z2002',
"DID" : ['d0001', 'd0002']}
]
}]
而正确的答案应该是:
[{
_id : "henten",
location: "some place",
devices: [
{"d_id": 'd0001',
"z_id": 'z2001'},
{"d_id": 'd0002',
"z_id": 'z2002'}
],
store: [
{"z_name" : 'vera',
"z_id" : 'z2001',
"DID" : ['d0001']},
{"z_name" : 'ghora',
"z_id" : 'z2002',
"DID" : ['d0002']}
]
}]
我应该如何处理这个?一个 z_id 可以有两个不同的 d_id,因此应该在 DID 数组中包含这两个 d_id。
解决方案
db.col.aggregate([
{
$addFields: {
store: {
$map: {
input: "$store",
as: "s",
in: {
z_name: "$$s.z_name",
z_id: "$$s.z_id",
DID: {
$map: {
input: {
$filter: {
input: "$devices",
as: "d",
cond: { $eq: [ "$$d.z_id", "$$s.z_id" ] }
}
},
as: "filtered",
in: "$$filtered.d_id"
}
}
}
}
}
}
}
])
推荐阅读
- node.js - Nodemail x Node.js:虽然测试成功但验证失败
- mysql - SQL查询在另一个订单之后进行排序(保留前一个订单)
- python - 指定的模板库无效。尝试加载“compressor.templatetags.compress”时引发 ImportError:无法导入名称“六”
- java - 注释处理器与其他注释处理器创建的Java注释处理编辑文件
- python - 无法使用 python selenium 抓取某些 DIV 标签
- java - 在全状态处理中,您应该如何处理由于从未达到缓冲区大小而未处理的数据?
- configuration - 如何为普罗米修斯操作员启用其他配置
- html - 重构特殊的 HTML 字符
- html - 如何使用 Angular 8 反应形式验证多个预选复选框
- oracle - 为什么我在通过 opatch 应用补丁时收到错误代码 135?