我使用的是mongodb 2.6。我已經存儲在這個形式我的數據:Group通過在MongoDb上的聚合
{
"_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()-1天的聚合平均值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"}, ???}}
])
,其結果將是1H分組在此時間間隔的平均值。 假設欲聚合的平均值爲十二月31的每隔一小時:
的間隔31/12/2015 20點00分00秒,平均時間戳:的間隔31的xyz
時間戳/二千零十五分之一十二21:00:00,平均:XYZ
此時爲了達到我要的時間間隔1小時間隔分割並進行多次數據庫請求。使用InfluxDB做我做同樣的
IE:
"SELECT MEAN(value) From myMeasures where key='my-sensor-1' and time > now() - 1d GROUP BY time(1h)"
真正有用的,但我認爲這是失去了一些東西(也許我沒有具體說明它在我的問題)。爲了迭代列表中的項目,我必須添加另一個$匹配項,因爲當條件爲真時,它會返回整個項目。所以查詢是這樣的: db.pointsTest.aggregate({$ match:{$ and:[{「points.timeStamp」:{$ gte:1453797806927}},{「_id」:「my-sensor-1」} ]},{$ unwind:「$ points」},{$ match:{「points.timeStamp」:{$ gte:1453797806927}}},{「$ group」:{「_id」:{「$ subtract」 :[「$ points.timeStamp」,{「$ mod」:[「$ points.timeStamp」,1000 * 60]}]},「average」:{「$ avg」:「$ points.value」}}} ) – bill