首页 > 解决方案 > 聚合 - MongoDB:按 id 对不同的值求和

问题描述

我对集合执行聚合,但结果不是预期的:

db.getCollection('test').aggregate(
                          [
                           {$match: { "colx" : 8323, "id" : {$in:    [802, 801, 803, 805, 810, 806, 807, 808, 809, 816]}}},
                           {$group : {_id : { coly : "$coly" , id : "$id" } ,  total: {$sum: "$val"} } },
                         ])

集合'test'包含字段coly,id,val,并且每个id对于具有不同值的不同coly可以是相同的,并且对于同一个'coly',一个id可以存在多次。

聚合的目的是通过按字段'coly'分组的"id"获取值 ( 'val' ) 的总和。

mongo 版本是 3.4。

请问有什么帮助吗?

结果是:

/* 1 */
{
"_id" : {
    "coly" : 898,
    "id" : 801
},
"total" : 3355560
}

/* 2 */
{
"_id" : {
    "coly" : 898,
    "id" : 805
},
"total" : 2760139
}

预期结果:

{
"_id": 898,
"results": [{
        "id": 801,
        "total": 3355560
    },
    {
        "id": 805,
        "total": 2760139
    }
]
}

标签: mongodbaggregation-framework

解决方案


你的话太模棱两可了。

根据您的预期结果,我认为您的查询是分组coly然后分组id并计算每个组的总数:

db.test.aggregate([
   {$match: { "colx" : 8323, "id" : {$in: [802, ....]}}},
   {$group: {_id : { coly : "$coly" , id : "$id" } ,  total: {$sum: "$val"} } },
   {$group: {_id: '$_id.coly', items: {$push: {id: '$_id.id', total: '$total'}} } }
])

这将输出:

{
"_id": 898,
"items": [
   {
    "id" : 801
    "total" : 3355560
   },
   {
    "id" : 805
    "total" : 2760139
   }
]
}

推荐阅读