Как получить значения объекта с одним и тем же ключом внутри массива - PullRequest
0 голосов
/ 20 июня 2019

Я пытаюсь получить (отфильтровать) все объекты из массива документов, которые соответствуют одному и тому же ключу.

Пример схемы документа:

{
    ...
    country: "ES",
    aut_comms: 
    [
        ...
        {name: "Aragon", province: "Huesca"},
        {name: "Aragon", province: "Teruel"},
        {name: "Aragon", province: "Zaragoza"},
        {name: "Madrid", province: "Madrid"}
        ...
    ]
}

Если это возможно, япривязка к извлечению из запроса только значений из объектов, соответствующих одному и тому же ключу.В результате получается массив, составленный следующим образом: ["Huesca", "Teruel", "Zaragoza"]

Массив объектов, которые соответствуют фильтру, также выполнит свою задачу:

[
    {name: "Aragon", province: "Huesca"},
    {name: "Aragon", province: "Teruel"},
    {name: "Aragon", province: "Zaragoza"}
]

Thanx

Ответы [ 2 ]

1 голос
/ 20 июня 2019

Вы сможете получить этот массив, сначала развернув массив и затем манипулируя им

    db.demo.aggregate([
        {
            $unwind:"$aut_comms"
        },
        {
            $match:{"aut_comms.name":"Aragon"}
        },
        {
            $group:{
                _id:null,
                result: {$push:"$aut_comms.province"}
            }
        }
   ])
0 голосов
/ 20 июня 2019

Редактировать

Такой запрос и вывод действительно возможны в ожидаемом формате. Вы можете сначала либо $unwind, либо $match. Лично я предпочитаю сначала выполнить $match, так как это ограничит количество (ненужных) документов, генерируемых операцией $unwind.

db.getCollection('col').aggregate([
    {$match: {"aut_comms.name": "Aragon"}},
    {$project: {_id: 0, "aut_comms": 1}},
    {$unwind: "$aut_comms"},
    {$match: {"aut_comms.name": "Aragon"}},
    {$project: {"province": "$aut_comms.province"}},
    {$group: {
        _id: null,
        province: {$push: "$province"}
    }}
])

Вывод будет:

/* 1 */
{
    "_id" : null,
    "province" : [ 
        "Huesca", 
        "Teruel", 
        "Zaragoza"
    ]
}
...