sql >> Databáze >  >> NoSQL >> MongoDB

MongoDB :Existuje způsob, jak zjistit trend hodnoty pomocí agregace?

Hrubý obrys:Počítal bych průměr za desetiminutovou periodu:

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

Pak bych to uložil do jiné sbírky:

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

Nakonec si vzpomeňte na dva průměry, které potřebujete k výpočtu rozdílu, a vypočítejte jej:

> 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

Můžete také přeskočit pravidelné agregace a místo toho udržovat průběžný průměr aktualizovaný v sensor_averages , skákání na nový dokument každých 10 minut. Na začátku každého 10minutového období vložte do sensor_averages dokument

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

pak na každé vložení sensor_reading dokumentu na dalších deset minut, aktualizujte také sensor_averages doc:

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

Poté, až budete chtít rozdíl mezi průměry, vyvolejte příslušné dva dokumenty, rozdělte svalues podle nvalues získat průměr a odečíst.



  1. $unset na více polích v mongodb

  2. jak porovnat dvě pole v dokumentu v agregaci potrubí (mongoDB)

  3. Proces work-horse byl neočekávaně ukončen RQ a Scrapy

  4. Jak bezpečně načíst hash a převést hodnotu na logickou hodnotu, pokud existuje