Docs Menu
Docs Home
/ /
Contextos de aplicación específicos

Modelar datos de IoT

El Internet de las Cosas (IdC) 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.

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

  • Optimizar el uso del almacenamiento.

Los parámetros comunes para agrupar datos son:

  • hora

  • fuente de datos (si tiene 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 es escalable en términos de datos y tamaño de índice. Por ejemplo, si la aplicación requiere índices en los campos sensor_id y timestamp, cada lectura entrante del sensor deberá indexarse ​​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 utiliza realmente los datos. Un usuario probablemente no consultaría una lectura de temperatura específica, sino el comportamiento de la temperatura a lo largo de una hora o un día. El patrón Bucket facilita estas consultas al agrupar los datos en períodos de tiempo uniformes.

El documento de ejemplo contiene dos campos calculados: transaction_count sum_temperaturey. Si la aplicación necesita recuperar con frecuencia la suma de temperaturas de una hora determinada, calcular un total acumulado de la suma puede ayudar a ahorrar recursos. Este enfoque de Patrón Calculado elimina la necesidad de calcular la suma cada vez que se solicitan los datos.

Los valores sum_temperature y transaction_count preagregados permiten realizar cálculos adicionales, como la temperatura promedio (sum_temperature / transaction_count) para un intervalo específico. Es mucho más probable que los usuarios consulten la aplicación para obtener la temperatura promedio entre las 2:00 y las 3:00 p. m., en lugar de consultar la temperatura específica a las 2:03 p. m. Al agrupar y precalcular ciertos valores, la aplicación facilita la entrega de dicha información.

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.

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.save( { 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 ) );

Volver

Datos calculados

En esta página