MongoDB从数组字段聚合

时间:2014-02-04 13:07:28

标签: mongodb aggregation-framework

我有以下系列:

{
  "_id" : ObjectId("52e7aa3ed3d55b9b01e23f34"),
  "time" : mytime,
  "type_instance" : "",
  "values" : [0.23, 0.08, 0.06],
  "types" : ["type0", "type1", "type2"]
}

我想按时间分组以获得每个索引的平均值。期望的结果将是:

{
  "time" : mytime,
  "values" : [avg 0, avg 1, avg 2],
  "types" : ["type0", "type1", "type2"]
}

我试图聚合

collection.aggregate([
                   {   "$match": {'time':  {"$gte": start}

                                 } 
                   }
                   ,{    "$project": {
                           "time":"$time",
                           "values":  "$values"                   
                       }
                   }

                   ,{   
                       "$group": {"_id": "$time", "avg": {avg:"$values[0]"}}
                   }

                   ,{
                       "$sort": {"time": 1}
                   }
                      ], function(err, data) {});

当然这不起作用,我不能使用“$ values [0]”。 有没有办法做到这一点?

1 个答案:

答案 0 :(得分:2)

我认为问题可能在于您的文档结构,因为您希望间接地将values字段中的值链接到types字段中的值,这可能会更方便:< / p>

{
   "_id": ObjectId("52e7aa3ed3d55b9b01e23f34"),
   "time" : mytime,
   "type_instance" : "",
   "whatever":[{
        "type": 0,
        "value": 0.23
   },{
        "type": 1,
        "value": 0.08
   },{
        "type": 2,
        "value": 0.06
   }]
} 

这样,您可以在展开whatever字段后按时间和类型(或我认为您引用的索引)进行分组:

collection.aggregate([
    {$unwind: "$whatever"},
    {$match: {"time": ...},
    {$group:{
        _id: {"$time", "$whatever.type"},
        avg: {$avg: "$whatever.value"}
    }}
])

这样,您将获得每个时间组的N个文档,其中N = whatever字段中的类型或子文档数。