复合聚合命令MongoDB

时间:2013-12-18 11:03:03

标签: mongodb aggregation-framework

我在Mongo数据库中有大量文档,结构如下:

{
    "_id" : {
        "birthDate" : "1978-08-09",
        "name" : "Peter"
},
    "value" : {
        "types" : {
            "euro" : 90,
            "unknown" : 2,
            "dollar" : 3
        }
    }
}

并非所有文件都包含所有类型(例如:其中一些只有euro或没有unknown字段。

我想用聚合框架计算特定名称的每个type的出现次数。

我有这个:

db.collection.aggregate({$match: {_id : {name:"John"}}}, {$group: {_id: '', euro: {$sum: '$value.types.euro'}, dollar: {$sum: '$value.types.dollar'}, unknown: {$sum: '$value.types.unknown'}}})

但它正在回归:

{ "result" : [ ], "ok" : 1 }

我的问题是:如何使用Mongo的聚合框架计算特定type的每个coin的{​​{1}}?是否也可以获得表单中每个名称的列表:

name

我正在使用MongoDB和Java驱动程序,所以如果答案是用Java代码,那将是完美的。

2 个答案:

答案 0 :(得分:3)

您可以使用以下查询按名称分组&数硬币:

db.collection.aggregate(
  {$group : {_id : "$_id.name", 
             dollar : {$sum : "$value.types.dollar"}, 
             euro : {$sum : "$value.types.euro"}, 
             unknown : {$sum : "$value.types.unknown"}}}
)

此外,如果您想查找特定人物的硬币数量,您可以使用以下查询:

db.collection.aggregate(
  {$match : {"_id.name" : "John"}},
  {$group : {_id : "$_id.name", 
             dollar : {$sum : "$value.types.dollar"}, 
             euro : {$sum : "$value.types.euro"}, 
             unknown : {$sum : "$value.types.unknown"}}}
)

答案 1 :(得分:1)

要计算特定type的每个coin的{​​{1}},您可以这样做:

name