mongodb - MongoDB 按键和值聚合映射
问题描述
我想按键聚合以下内容并对值求和:
{
"_id": {
"$oid": "60dd5e0bd0ba24343dabc626"
},
"s": {
"_71vnohpi4": {
"q": 2
}
}
},
{
"_id": {
"$oid": "609ea0b0c85ca8e54adc610c"
},
"s": {
"_71vnohpi4": {
"q": 49
},
"_h2121audz": {
"q": 20
}
}
}
想总结如下的价值:
{
"_id": {
"$oid": "newid-doesntmatter"
},
"s": {
"_71vnohpi4": {
"q": 51
},
"_h2121audz": {
"q": 20
}
}
}
大多数可用的示例都适用于数组,因此$unwind
在我的情况下不起作用。而且由于键是动态的,我无法指定键名。
解决方案
有聚合运算符,例如$objectToArray
and $arrayToObject
:
将对象转换为数组(键值对)
展开以拆分为单独的文档。
再次将值 Object 转换为数组,因为它又是一个对象。
再次放松
基于
id
和的组key
(这将给出总和)分组阶段以组合最内部的键/值。
组合所有文件的小组阶段。
$arrayToObject
用于到达单个对象的项目。[{ '$project': { 's': { '$objectToArray': '$s' } } }, { '$unwind': '$s' }, { '$addFields': { 's-v': { '$objectToArray': '$s.v' } } }, { '$unwind': '$s-v' }, { '$group': { '_id': { 'id': '$s.k', 'key': '$s-v.k' }, 'stats': { '$sum': '$s-v.v' } } }, { '$group': { '_id': '$_id.id', 'sum': { '$mergeObjects': { '$arrayToObject': [ [ [ '$_id.key', '$stats' ] ] ] } } } }, { '$group': { '_id': '1', 'obj': { '$push': { 'k': '$_id', 'v': '$sum' } } } }, { '$project': { 'final': { '$arrayToObject': '$obj' } } }]
推荐阅读
- python - 如何在字典中打印递增顺序?
- laravel - 如何动态加载/渲染 Laravel Collective 表单?
- angular - Angular Primeng 侧边栏是透明的
- angular - NgFor 仅支持绑定到 Iterables,例如 Arrays。(离子4)
- r - 由于 R 中的“内存不足”,Cairo pdf 无法正常工作
- python - django allauth 适配器注册:禁止保存()以防止由于未保存的相关对象“用户”而导致数据丢失
- assembly - 计算字符串的长度然后添加到 cx
- python - Pandas-如何获取另一列中每个对应值的行出现次数
- php - Codeigniter 3.1.5 无法在 Bluehost 上运行
- sql - 找不到“列在选择列表中无效”的解决方法