Mongodb聚合取平均值

时间:2014-03-18 13:15:30

标签: mongodb aggregation-framework

在MongoDb中,我有一个包含以下数据的集合:

[{
    _id: ObjectId('....'),
    data: [{
        type: 'internal',
        name: 'abc',
        value: 60
    }, {
        type: 'internal',
        name: 'def',
        value: 20
    }, {
        type: 'external',
        name: 'def',
        value: 20
    }]
}, {
    _id: ObjectId('....'),
    data: [{
        type: 'internal',
        name: 'abc',
        value: 30
    }, {
        type: 'internal',
        name: 'def',
        value: 40
    }, {
        type: 'external',
        name: 'def',
        value: 10
    }]
}]

现在如果我想按类型进行分组并取平均字段,我可以这样做

db.testcollection.aggregate([
    {$unwind: '$data'}, 
    {$group: {_id: '$data.type', avg: {$avg: '$data.value'}}}
]);

但是,如果必须处理一个相同类型文档的值有一个值(两者的总和)然后必须计算平均值,那么查询是什么?

在我的内部类型的示例中,它应该是:

((60+20)+(30+40))/2

而不是

(60+20+30+40)/4

1 个答案:

答案 0 :(得分:1)

你可以在2个$组阶段完成。第一个用于计算文档中的总和,第二个用于计算文档的平均值。

db.testcollection.aggregate([
    {$unwind: "$data"}, 
    {$group: {_id: {_id:"$_id", type:"$data.type"}, sum:{"$sum": "$data.value"}}}
    {$group:{_id:"$_id.type", avg:{"$avg":"$sum"}}}
]);