粗略概述:我将计算十分钟期间的平均值:
> var avgCursor = db.sensor_readings.aggregate([
{ "$match" : { "created_at" : { "$gt" : ten_minutes_ago, "$lte" : now } } }
{ "$group" : { "_id" : 0, "average" : { "$avg" : "$value" } } }
]}
> var avgDoc = avgCursor.toArray()[0]
> avgDoc
{ "_id" : 0, "average" : 23 }
然后我会将其存储在另一个集合中:
> db.sensor_averages.insert({ "start" : ten_minutes_ago, "end" : now, "average" : avgDoc.average })
最后,回想计算差异所需的两个平均值,并计算它:
> var diffCursor = db.sensor_averages.find({ "start" : { "$gte" : twenty_minutes_ago } }).sort({ "start" : -1 })
> var diffArray = diffCursor.toArray()
> var difference = diffArray[0].average - diffArray[1].average
您还可以跳过定期聚合,而是在中更新运行平均值sensor_averages
,每 10 分钟跳转到一个新文档。在每 10 分钟时段开始时,插入sensor_averages
a doc
{
"start" : now,
"svalues" : 0,
"nvalues" : 0
}
然后在每个插入sensor_reading
接下来十分钟的文档,同时更新sensor_averages
doc:
db.sensor_averages.update(
{ "start" : now_rounded_to_the_ten_minute_boundary },
{ "$inc" : { "svalues" : value, "nvalues" : 1 } }
)
然后,当您想要平均值之间的差异时,请回忆适当的两个文档,除以svalues
by nvalues
得到平均值,然后减去。