sql >> Database teknologi >  >> NoSQL >> MongoDB

MongoDB:Er der en måde at opdage en værditrend ved hjælp af aggregering?

Groft skitsering:Jeg ville beregne gennemsnittet for den ti minutters periode:

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

Så ville jeg gemme det i en anden samling:

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

Husk endelig de to gennemsnit, du skal bruge for at beregne forskellen, og udregn 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 også springe de periodiske sammenlægninger over og i stedet holde et løbende gennemsnit opdateret i sensor_averages , hopper til en ny doc hvert 10. minut. I begyndelsen af ​​hver 10-minutters periode skal du indsætte i sensor_averages et dokument

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

derefter på hver indsættelse af en sensor_reading dokument i de næste ti minutter, skal du også opdatere sensor_averages doc:

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

Når du derefter vil have forskellen mellem gennemsnit, skal du huske de relevante to dokumenter, dividere svalues af nvalues for at få gennemsnittet, og trække fra.



  1. Tørrer en generisk RedisTemplate op i foråret 4

  2. Sådan vælger du data med en given betingelse

  3. Hvordan importerer man data fra mongodb til pandaer?

  4. Flersproget datamodellering på MongoDB