El Internet de las cosas (IoT) es una red de objetos físicos conectados a Internet. Muchos de estos dispositivos, como los sensores, generan datos.
Para almacenar y recuperar estos datos de manera eficiente, puede utilizar el patrón de cubo.
El patrón de cubo
Un método común para organizar los datos de IoT es agrupar los datos en unidades. El agrupamiento organiza grupos específicos de datos para ayudar a:
Descubra tendencias históricas,
Prever tendencias futuras, y
Optimiza el uso del almacenamiento.
Los parámetros comunes para agrupar datos son:
hora
fuente de datos (si tienes varios conjuntos de datos)
cliente
tipo de datos (por ejemplo, tipo de transacción en datos financieros)
Nota
A partir de MongoDB 5.0, colecciones de series temporales son el tipo de colección recomendado para datos de series de tiempo. No utilices el patrón de depósito junto con colecciones de series temporales, ya que esto puede degradar el rendimiento.
Considera una colección que almacena datos de temperatura obtenidos de un sensor. El sensor registra la temperatura cada minuto y almacena los datos en una colección llamada temperatures:
// temperatures collection { "_id": 1, "sensor_id": 12345, "timestamp": ISODate("2019-01-31T10:00:00.000Z"), "temperature": 40 } { "_id": 2, "sensor_id": 12345, "timestamp": ISODate("2019-01-31T10:01:00.000Z"), "temperature": 40 } { "_id": 3, "sensor_id": 12345, "timestamp": ISODate("2019-01-31T10:02:00.000Z"), "temperature": 41 } ...
Este enfoque no escala bien en términos de tamaño de datos e índices. Por ejemplo, si la aplicación requiere índices en los campos sensor_id y timestamp, cada lectura entrante desde el sensor tendría que ser indexada para mejorar el rendimiento.
Puedes aprovechar el modelo orientado a documentos para agrupar los datos en documentos que contengan las mediciones de un intervalo de tiempo determinado. Considera el siguiente esquema actualizado que agrupa las lecturas tomadas cada minuto en grupos de una hora:
{ "_id": 1, "sensor_id": 12345, "start_date": ISODate("2019-01-31T10:00:00.000Z"), "end_date": ISODate("2019-01-31T10:59:59.000Z"), "measurements": [ { "timestamp": ISODate("2019-01-31T10:00:00.000Z"), "temperature": 40 }, { "timestamp": ISODate("2019-01-31T10:01:00.000Z"), "temperature": 40 }, ... { "timestamp": ISODate("2019-01-31T10:42:00.000Z"), "temperature": 42 } ], "transaction_count": 42, "sum_temperature": 1783 }
Este esquema actualizado mejora la escalabilidad y refleja cómo la aplicación realmente utiliza los datos. Un usuario probablemente no consultaría una lectura de temperatura específica. En cambio, un usuario probablemente query el comportamiento de la temperatura a lo largo de una hora o día. El patrón Bucket ayuda a facilitar esas queries agrupando los datos en períodos de tiempo uniformes.
Combinar los patrones computados y de bucket
La ejemplo de documento contiene dos campos calculados: transaction_count y sum_temperature. Si la aplicación necesita con frecuencia recuperar la suma de temperaturas para una hora dada, calcular un total acumulado de la suma puede ayudar a ahorrar recursos de la aplicación. Este enfoque de patrón computado elimina la necesidad de calcular la suma cada vez que se solicita el dato.
Los valores preagregados sum_temperature y transaction_count permiten realizar cálculos adicionales como la temperatura promedio (sum_temperature / transaction_count) para un contenedor en particular. Es mucho más probable que los usuarios query la aplicación para conocer la temperatura promedio entre las 2:00 y las 3:00 p.m. que query la temperatura específica a las 2:03 p.m. El agrupamiento y la precalculación de ciertos valores permite que la aplicación proporcione más fácilmente esa información.
Representaciones de tiempo en MongoDB
MongoDB almacena los tiempos en UTC por defecto, y convierte cualquier representación de tiempo local en esta forma. Las aplicaciones que deben funcionar o informar sobre algún valor local de tiempo no modificado pueden almacenar la zona horaria junto con la marca de tiempo UTC y calcular la hora local original en su lógica de aplicación.
Ejemplo
En la shell de MongoDB, puedes almacenar tanto la fecha actual como el desfase actual del cliente respecto al UTC.
var now = new Date(); db.data.insertOne( { date: now, offset: now.getTimezoneOffset() } );
Se puede reconstruir la hora local original aplicando el desfase almacenado:
var record = db.data.findOne(); var localNow = new Date( record.date.getTime() - ( record.offset * 60000 ) );