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 depósito.
El patrón de cubo
Un método común para organizar datos de IoT es agruparlos en grupos. La segmentación organiza grupos específicos de datos para ayudar a:
Descubra las 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, Las colecciones de series temporales son el tipo de colección recomendado para datos de series temporales.No utilice el patrón de depósito junto con las colecciones de series temporales, ya que esto puede reducir 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 la hora en UTC por defecto y convierte cualquier representación horaria local a este formato. Las aplicaciones que deben operar o informar sobre algún valor horario local sin modificar pueden almacenar la zona horaria junto con la marca de tiempo UTC y calcular la hora local original en la lógica de su aplicación.
Ejemplo
En el shell de MongoDB, puede almacenar tanto la fecha actual como la diferencia horaria del cliente actual con respecto a UTC.
var now = new Date(); db.data.insertOne( { date: now, offset: now.getTimezoneOffset() } );
Puede reconstruir la hora local original aplicando la diferencia guardada:
var record = db.data.findOne(); var localNow = new Date( record.date.getTime() - ( record.offset * 60000 ) );