sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDB :Finns det ett sätt att upptäcka en värdetrend med hjälp av aggregering?

Grov översikt:Jag skulle beräkna genomsnittet för tiominutersperioden:

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

Då skulle jag lagra den i en annan samling:

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

Slutligen, kom ihåg de två medelvärden du behöver för att beräkna skillnaden, och beräkna den:

> 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

Du kan också hoppa över de periodiska aggregeringarna och istället hålla ett löpande medelvärde uppdaterat i sensor_averages , hoppar till ett nytt dokument var tionde minut. I början av varje 10-minutersperiod, infoga i sensor_averages ett dokument

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

sedan på varje infogning av en sensor_reading dokument för de kommande tio minuterna, uppdatera även sensor_averages doc:

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

Sedan, när du vill ha skillnaden mellan medelvärden, återkalla lämpliga två dokument, dividera svalues av nvalues för att få medelvärdet och subtrahera.



  1. Kommunikation mellan två Docker-behållare på macOS 10.12

  2. Är Redis list eller set pop metod tråd säker?

  3. Bästa metoder för säkerhetskopiering av databas

  4. Hur fungerar ServiceStack Redis för att hämta data