【发布时间】:2016-04-29 03:14:06
【问题描述】:
我使用 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" : "my-sensor-1", "average" : 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"}, ???}}
])
结果将是按 1 小时分组的该时间间隔的平均值。 假设我想汇总 12 月 31 日每小时的平均值:
时间间隔 31/12/2015 20:00:00 的时间戳,平均值:xyz
时间间隔 31/12/2015 21:00:00 的时间戳,平均值:xyz
此时,为了实现这一点,我必须将时间间隔拆分为 1 小时间隔,并向数据库发出多个请求。
I.E 使用 InfluxDB 做同样的事情我这样做:
"SELECT MEAN(value) From myMeasures where key='my-sensor-1' and time > now() - 1d GROUP BY time(1h)"
【问题讨论】:
标签: mongodb aggregation-framework