Mongodb Aggregate zapytanie sumujące wszystkie wartości na podstawie pól wewnątrz obiektów w Array
Dec 11 2020
Mam kolekcję data
w MongoDB, która wygląda następująco -
dokument 1-
{
metadata:[
{
"title": "High",
"val": 12
},
{
"title": "Medium",
"val": 15
},
{
"title": "Low",
"val": 2
}
]
}
dokument2 -
{
metadata:[
{
"title": "High",
"val": 10
},
{
"title": "Medium",
"val": 12
},
{
"title": "Low",
"val": 20
}
]
}
& wkrótce..
Chcę zagregować val
pole na podstawie title
wartości. Wynik powinien wyglądać następująco -
{
"High": 22,
"Medium": 27,
"Low": 22
}
Jak to osiągnąć? Z góry dziękuję.
Odpowiedzi
2 turivishal Dec 11 2020 at 12:51
$unwind
dekonstruowaćmetadata
tablicę$grpup
przeztitle
i zrób sumęval
$group
by null, konwertuj tablicę na obiekt z klucza i wartości według$arrayToObject
oraz scal obiekty przy użyciu$mergeObjects
db.collection.aggregate([
{ $unwind: "$metadata" }, { $group: {
_id: "$metadata.title", sum: { $sum: "$metadata.val" } } }, { $group: {
_id: null,
metadata: {
$mergeObjects: { $arrayToObject: [
[{ k: "$_id", v: "$sum" }]
]
}
}
}
}
])
Plac zabaw
1 ray Dec 11 2020 at 12:31
Możesz najpierw $ rozwinąć metadata
tablicę. Następnie użyj $ group i$cond to $zsumuj swoje wartości.
Oto plac zabaw dla mongo w celach informacyjnych.