我使用的是 MongoDB 2.6 版本。我已经将我的数据以以下形式存储:
{
"_id" : "my-sensor-1",
"points": [
{ "timeStamp" : NumberLong("1453468362174"), "value" : 41 },
{ "timeStamp" : NumberLong("1453468483297"), "value" : 66 },
{ "timeStamp" : NumberLong("1453468485568"), "value" : 49 },
...
]
}
为了聚合文档,我会执行以下查询:
db.pointsTest.aggregate([
{ $match: { $and: [ {"points.timeStamp" : { $gt : 1453433925163}},
{"_id":"my-sensor-10"} ] } },
{"$unwind":"$points"},
{$group: {_id: "my-sensor-1","average":{$avg : "$points.value"}}}
])
{ "_id" : "我的传感器-1", "平均值" : 52 }
结果
我已将时间戳存储为毫秒,因此每次想要聚合特定的时间间隔时,必须更改timeStamp值的边界。
如何在时间段上进行聚合,并按间隔(即从now() -1day聚合平均值 GROUP by 1h)对结果进行分组?
编辑
我想做这样的事情:
db.pointsTest.aggregate([
{ $match: { $and: [ {"points.timeStamp" : { $gt : 1453433925163, $lt : 1453555555555}}, {"_id":"my-sensor-10"} ] } }, {"$unwind":"$points"}, {$group: {_id: "my-sensor-1","average":{$avg : "$points.value"}, ???}}
])
并且结果将会是按每小时分组的该时间间隔均值。假设我想要聚合12月31日每个小时的平均值:
目前为止,为了实现这一点,我必须将时间间隔分成1小时的间隔,并向数据库发出多个请求。时间间隔的时间戳为 2015年12月31日20:00:00,平均值为:xyz
时间间隔的时间戳为 2015年12月31日21:00:00,平均值为:xyz
例如使用InfluxDB完成相同的操作,我会这样做:
"SELECT MEAN(value) From myMeasures where key='my-sensor-1' and time > now() - 1d GROUP BY time(1h)"