我有以下系列:
{
"_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]”。 有没有办法做到这一点?
答案 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
字段中的类型或子文档数。