Dàn ý sơ lược:Tôi sẽ tính giá trị trung bình trong khoảng thời gian mười phút:
> 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 }
Sau đó, tôi sẽ lưu trữ nó trong một bộ sưu tập khác:
> db.sensor_averages.insert({ "start" : ten_minutes_ago, "end" : now, "average" : avgDoc.average })
Cuối cùng, hãy nhớ lại hai giá trị trung bình mà bạn cần để tính toán sự khác biệt và tính toán nó:
> 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
Bạn cũng có thể bỏ qua các tổng hợp định kỳ và thay vào đó, cập nhật mức trung bình hoạt động trong sensor_averages
, chuyển sang một tài liệu mới cứ sau 10 phút. Vào đầu mỗi khoảng thời gian 10 phút, hãy chèn vào sensor_averages
một tài liệu
{
"start" : now,
"svalues" : 0,
"nvalues" : 0
}
sau đó trên mỗi lần chèn một sensor_reading
tài liệu trong mười phút tới, đồng thời cập nhật sensor_averages
doc:
db.sensor_averages.update(
{ "start" : now_rounded_to_the_ten_minute_boundary },
{ "$inc" : { "svalues" : value, "nvalues" : 1 } }
)
Sau đó, khi bạn muốn sự khác biệt giữa các giá trị trung bình, hãy nhớ lại hai tài liệu thích hợp, chia svalues
bởi nvalues
để lấy giá trị trung bình và trừ đi.