bil*_*ill 6 mongodb aggregation-framework
我用的是mongodb 2.6.我以这种形式存储了我的数据:
{
"_id" : "my-sensor-1",
"points": [
{ "timeStamp" : NumberLong("1453468362174"), "value" : 41 },
{ "timeStamp" : NumberLong("1453468483297"), "value" : 66 },
{ "timeStamp" : NumberLong("1453468485568"), "value" : 49 },
...
]
}
Run Code Online (Sandbox Code Playgroud)
为了聚合文档,我做了这样的查询:
db.pointsTest.aggregate([
{ $match: { $and: [ {"points.timeStamp" : { $gt : 1453433925163}},
{"_id":"my-sensor-10"} ] } },
{"$unwind":"$points"},
{$group: {_id: "my-sensor-1","average":{$avg : "$points.value"}}}
])
Run Code Online (Sandbox Code Playgroud)
{"_ id":"my-sensor-1","average":52}
结果
我已将时间戳存储为毫秒,因此每次我想要聚合特定时间间隔时,我必须更改timeStamp值的范围.
我怎样才能在一个时间段内进行聚合并按间隙间隔对结果进行分组(即将现在的平均值()-1day GROUP聚合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"}, ???}}
])
Run Code Online (Sandbox Code Playgroud)
结果将是这个时间间隔的平均值,按1h分组.假设我想要汇总12月31日每小时的平均值:
时间间隔31/12/2015 20:00:00,平均值:xyz
时间间隔31/12/2015 21:00:00,平均值:xyz
此时为了实现这一点,我必须在1小时间隔内分割时间间隔并向数据库发出几个请求.
IE使用InfluxDB做同样的事情我这样做:
"SELECT MEAN(value) From myMeasures where key='my-sensor-1' and time > now() - 1d GROUP BY time(1h)"
Run Code Online (Sandbox Code Playgroud)
您需要在 Mongo 查询中进行一些数学计算,以根据不同的间隔对数据进行分组。
$subtract 和 $mod 的组合将帮助您按特定间隔对数据进行分组。
查询将如下所示:
db.sensor.aggregate({
$match: {
$and: [{
"points.timeStamp": {
$gt: 1453433925163,
$lt: 1453555555555
}
}, {
"_id": "my-sensor-1"
}]
}
}, {
$unwind: "$points"
}, {
"$group": {
"_id": {
"$subtract": ["$points.timeStamp", {
"$mod": ["$points.timeStamp", 1000 * 60]
}]
},
"average": {
"$avg": "$points.value"
}
}
})
Run Code Online (Sandbox Code Playgroud)
希望这会对您有所帮助。
| 归档时间: |
|
| 查看次数: |
234 次 |
| 最近记录: |