MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

MongoDB:Existe uma maneira de detectar uma tendência de valor usando agregação?


Esboço aproximado:eu calcularia a média para o período de dez minutos:
> 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 }

Então eu guardaria em outra coleção:
> db.sensor_averages.insert({ "start" : ten_minutes_ago, "end" : now, "average" : avgDoc.average })

Por fim, lembre-se das duas médias necessárias para calcular a diferença e calcule-a:
> 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

Você também pode pular as agregações periódicas e, em vez disso, manter uma média de execução atualizada em sensor_averages , passando para um novo documento a cada 10 minutos. No início de cada período de 10 minutos, insira em sensor_averages um doc
{
    "start" : now,
    "svalues" : 0,
    "nvalues" : 0
}

então em cada inserção de um sensor_reading documento pelos próximos dez minutos, atualize também o sensor_averages documento:
db.sensor_averages.update(
    { "start" : now_rounded_to_the_ten_minute_boundary },
    { "$inc" : { "svalues" : value, "nvalues" : 1 } }
)

Então, quando você quiser a diferença entre as médias, recupere os dois documentos apropriados, divida svalues por nvalues para obter a média e subtrair.