首页 > 解决方案 > 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。

标签: mongodbaggregation-framework

解决方案


您可以运行$map$filter的组合,尝试:

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"
                            }
                        }
                    }
                }
            }
        }
    }
])

蒙戈游乐场


推荐阅读