mongodb聚合:如果两个字段的值匹配,则将相应字典的另一个字段的值添加到新字段

Nazmus Sakib AbIR

在三个集合之间使用聚合查找后,得到以下结果。

[{
_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。

米克尔

您可以运行$ 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"
                            }
                        }
                    }
                }
            }
        }
    }
])

蒙哥运动场

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

$ project一个新字段,作为mongodb中至少两个字段

Django ModelField在添加新字段时将默认值添加到基于同一模型中的另一个字段

MongoDB:如何为集合中的每个文档设置一个新字段,该字段等于另一个字段的值

比较两个字典,如果一个字典中存在键/值对,则将其删除

MYSQL连接两个具有相同字段值的表字段,但如果另一个字段与另一个字段不匹配,则仍将包括

如何添加到不同的字段值并将其存储在弹性搜索python中的另一个字段中(弹性搜索字段操作)

根据另一个字段的值在MongoDB中投影一个字段

如何使用Ruby将另一个字段的值添加到HTTParty字段

MongoDB使用另一个字段的值添加新字段

Laravel验证:如果另一个字段可用,则需要两个字段中的任何一个

SOLR:将2个字段复制到另一个字段并将过滤器添加到该新字段

MongoDB Aggregate在文档中添加一个新字段(如果已存在另一个字段)

MongoDB比较两个字段并在所有文档上求和另一个字段

MongoDB聚合:将每个数组值从另一个字段添加到数组内的每个对象。合并/合并来自不同字段的两个数组

将arrayFilter的字段设置为匹配另一个字段的值

如果值位于两个值之间,则将另一个值添加到相应的行

将另一个字段从字段添加到验证器中

将字段值附加到另一个字段

PHP foreach两个数组,在一个数组中找到一个值,在另一个数组中使用另一个字段(添加到数组)

如果一个或另一个或两个字段匹配,则获取行

一个字段的MongoDb聚合框架值,其中最大另一个字段

将两个字典值合并为一个,然后将其添加到Python中的另一个字典中

Mongodb字段值作为另一个字段

Laravel更新字段,带有另一个字段值

匹配两个字典的键(一个嵌套)然后将值添加到内部嵌套字典

SELECT 在两个字段中具有相同值的行,在另一个字段中具有不同的值

MongoDB聚合获取字段的不同值和另一个字段的输出列表

比较另一个字典中两个字典的值

mongodb聚合添加从另一个字段派生的字段