大まかな概要:10分間の平均を計算します:
> 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 })
最後に、差を計算するために必要な2つの平均を思い出して、計算します。
> 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
に挿入します ドキュメント
{
"start" : now,
"svalues" : 0,
"nvalues" : 0
}
次に、sensor_reading
を挿入するたびに 次の10分間のドキュメント、sensor_averages
も更新します doc:
db.sensor_averages.update(
{ "start" : now_rounded_to_the_ten_minute_boundary },
{ "$inc" : { "svalues" : value, "nvalues" : 1 } }
)
次に、平均値の差が必要な場合は、適切な2つのドキュメントを思い出して、svalues
を除算します。 nvalues
による 平均を取得し、減算します。