Mongodb Aggregate query для суммирования всех значений на основе полей внутри объектов в массиве
Dec 11 2020
У меня есть коллекция data
в MongoDB, которая выглядит так:
документ 1-
{
metadata:[
{
"title": "High",
"val": 12
},
{
"title": "Medium",
"val": 15
},
{
"title": "Low",
"val": 2
}
]
}
документ2 -
{
metadata:[
{
"title": "High",
"val": 10
},
{
"title": "Medium",
"val": 12
},
{
"title": "Low",
"val": 20
}
]
}
& скоро..
Я хочу агрегировать val
поле на основе title
значения. Результат должен выглядеть так -
{
"High": 22,
"Medium": 27,
"Low": 22
}
Как мне этого добиться? Заранее спасибо.
Ответы
2 turivishal Dec 11 2020 at 12:51
$unwind
деконструироватьmetadata
массив$grpup
поtitle
и сделать суммуval
$group
по нулю, преобразовать массив в объект из ключа и значения по$arrayToObject
и объединить объекты, используя$mergeObjects
db.collection.aggregate([
{ $unwind: "$metadata" }, { $group: {
_id: "$metadata.title", sum: { $sum: "$metadata.val" } } }, { $group: {
_id: null,
metadata: {
$mergeObjects: { $arrayToObject: [
[{ k: "$_id", v: "$sum" }]
]
}
}
}
}
])
Игровая площадка
1 ray Dec 11 2020 at 12:31
Вы можете сначала $ развернуть metadata
массив. Затем используйте $ group и$cond to $суммируйте свои ценности.
Вот игровая площадка монго для вашей справки.