Агрегация mongodb: если значения двух полей совпадают, добавьте значение другого поля соответствующего словаря в новое поле - PullRequest
2 голосов
/ 15 апреля 2019

У меня следующий результат после использования поиска агрегации среди трех коллекций.

[{
_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'}
]
}]

Мне нужно передать значение 'd_id' в словари 'store' как массив в новое поле с именем'DID', если devices.z_id совпадает с store.z_id.

Я пробовал следующее:

{
        $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 и поэтому должен иметь эти два d_id внутри массива DID.

1 Ответ

1 голос
/ 15 апреля 2019

Вы можете запустить комбинацию $ 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"
                            }
                        }
                    }
                }
            }
        }
    }
])

Детская площадка Монго

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...