sql >> Database >  >> NoSQL >> MongoDB

MongoDB :Is er een manier om een ​​waardetrend te detecteren met behulp van aggregatie?

Ruwe schets:ik zou het gemiddelde voor de periode van tien minuten berekenen:

> 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 }

Dan zou ik het in een andere verzameling opslaan:

> db.sensor_averages.insert({ "start" : ten_minutes_ago, "end" : now, "average" : avgDoc.average })

Onthoud ten slotte de twee gemiddelden die u nodig hebt om het verschil te berekenen, en bereken het:

> 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

U kunt ook de periodieke aggregaties overslaan en in plaats daarvan een lopend gemiddelde bijwerken in sensor_averages , elke 10 minuten naar een nieuw document springen. Voeg aan het begin van elke periode van 10 minuten in sensor_averages een document

{
    "start" : now,
    "svalues" : 0,
    "nvalues" : 0
}

vervolgens op elke insert van een sensor_reading document voor de komende tien minuten, update ook de sensor_averages doc:

db.sensor_averages.update(
    { "start" : now_rounded_to_the_ten_minute_boundary },
    { "$inc" : { "svalues" : value, "nvalues" : 1 } }
)

Als u vervolgens het verschil tussen gemiddelden wilt weten, roept u de juiste twee documenten op, verdeelt u svalues door nvalues om het gemiddelde te krijgen en af ​​te trekken.



  1. Hoe verwijder min waarde in mongodb voor groep?

  2. Redis Stack Exchange hoe sleutels te verwijderen of op te halen volgens patroon

  3. MongoDB:aggregeer $project add-veld met statische waarde

  4. MongoDB-query met elemMatch voor geneste arraygegevens