मोटे तौर पर रूपरेखा:मैं दस मिनट की अवधि के लिए औसत की गणना करूंगा:
> 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
. में डालें एक दस्तावेज़
{
"start" : now,
"svalues" : 0,
"nvalues" : 0
}
फिर एक sensor_reading
. के प्रत्येक इंसर्ट पर अगले दस मिनट के लिए दस्तावेज़, sensor_averages
. को भी अपडेट करें डॉक्टर:
db.sensor_averages.update(
{ "start" : now_rounded_to_the_ten_minute_boundary },
{ "$inc" : { "svalues" : value, "nvalues" : 1 } }
)
फिर, जब आप औसत के बीच अंतर चाहते हैं, तो उपयुक्त दो दस्तावेज़ों को याद करें, svalues
को विभाजित करें nvalues
. द्वारा औसत प्राप्त करने और घटाने के लिए।