Archivo de la etiqueta: MongoDB

Agregar datos para una serie temporal con MongoDB

Supongamos una colección de datos en MongoDB que contiene documentos con una estructura similar a la siguiente, pertenecientes a un sistema de monitorización que guarda qué porcentaje de CPU consume cada proceso:

{ "proceso" : "1234",
  "timestamp" : 14567888841,
  "cpu" : 31.3 }

{ "proceso" : "33212",
 "timestamp" : 14567888941,
 "cpu" : 104 }

{ "proceso" : "1234",
 "timestamp" : 14567898381,
 "cpu" : 28.5 }

// etc...

Siendo “timestamp” una marca de tiempo. Por ejemplo, el número de milisegundos desde el 1/1/1970 00:00 UTF (System.currentTimeMillis en Java).

Si quisiéramos crear una serie temporal con, por ejemplo, el consumo medio de CPU del proceso ‘1234’ en bloques de 5 minutos (300.000 milisegundos), podríamos usar el framework de agregación de MongoDB enviando la siguiente petición (función aggregate):

[{ "$match":{
   "proceso": "1234"
 }},
 {"$group" : {
   "_id" : {
      "$subtract" : ["$timestamp" ,
                    {"$mod" : [ "$timestamp",
                                 300000 ]
                    }]
   },
   "cpu" : {"$avg": "$cpu" }
 }}]

Esta orden nos devolvería un array con todos los elementos de la serie de tiempo, similar al siguiente:

[{ "_id" : 14742000000, "cpu" : 22.33 },
 { "_id" : 14742300000, "cpu" : 12.30 },
 { "_id" : 14742600000, "cpu" : 33.75 },
 { "_id" : 14742900000, "cpu" : 10.69 },
 { etc... }}