Вы можете использовать ниже агрегации
Поскольку у вас есть неизвестные ключи, вы должны использовать $objectToArray
для преобразования динамических ключей в формат k
и v
, тогда вы можете легко $group
им.
db.collection.aggregate([
{ "$unwind": "$some_list" },
{ "$addFields": {
"some_list": { "$objectToArray": "$some_list.y" }
}},
{ "$unwind": "$some_list" },
{ "$group": {
"_id": "$some_list.k",
"count": { "$sum": "$some_list.v" }
}}
])
выход
[
{ "_id": "c", "count": 91 },
{ "_id": "d", "count": 75 },
{ "_id": "p", "count": 9 },
{ "_id": "b", "count": 118 },
{ "_id": "a", "count": 27 }
]
И даже если вам нужны данные в паре ключ-значение, вы можете использовать эту
db.collection.aggregate([
{ "$unwind": "$some_list" },
{ "$addFields": {
"some_list": { "$objectToArray": "$some_list.y" }
}},
{ "$unwind": "$some_list" },
{ "$group": {
"_id": "$some_list.k",
"count": { "$sum": "$some_list.v" }
}},
{ "$group": {
"_id": null,
"data": { "$push": { "k": "$_id", "v": "$count" }}
}},
{ "$replaceRoot": { "newRoot": { "$arrayToObject": "$data" }}}
])
выход
[
{
"a": 27,
"b": 118,
"c": 91,
"d": 75,
"p": 9
}
]