使用$ group对相同键的两个不同值的值求和

时间:2013-10-09 16:18:31

标签: mongodb aggregation-framework nosql

说我的数据看起来像这样:

{
    "name":"jack",
    "net_worth":1000
}

我想做一个汇总,将每个名为“john”或“jack”的人的平均净值作为单个数字返回。

db.mycollection.aggregate([
    {$group:
        {"_id":"$name",
         "average_worth":{$avg:"$net_worth"}
        }
    }    
])

此汇总将返回集合中具有相同名称的人的平均净值。我如何平均两个(或更多)特定名称?我知道我可以做$match来过滤除约翰斯和杰克之外的所有人,但我不知道如何将它们结合起来。

1 个答案:

答案 0 :(得分:0)

您可以将$match$or结合使用:

> db.ppl.insert({"name": "jack", "worth" : 240000});
> db.ppl.insert({"name": "john", "worth" : 14000});
> db.ppl.insert({"name": "bill", "worth" : 88000000});

> db.ppl.aggregate([ 
     { $match:{$or:[{name:"jack"},{name:"john"}]}}, 
     {$group : { "_id" : 1, "average_worth":{$avg:"$worth"} } }])
{
        "result" : [
                {
                        "_id" : 1,
                        "average_worth" : 127000
                }
        ],
        "ok" : 1
}

请注意,我必须为_id提出一些虚假$group,因为我们需要来自jack和john的结果的相同ID。