dev-resources.site
for different kinds of informations.
Series de tiempo en MongoDB
Introducci贸n
Los datos de series de tiempo, son colecciones de datos que pueden definirse como una secuencia de "data points" que tienen asociados una estampa de tiempo, es decir, consisten en m茅tricas hechas desde una fuente de datos sobre un determinado periodo de tiempo.
Ejemplos de series de tiempo
Algunos de los siguientes tipos de datos son adecuados para almacenarse en una colecci贸n de series temporales:
-
Datos Meteorol贸gicos:
- Temperatura, humedad, presi贸n atmosf茅rica, etc., registrados en intervalos regulares.
-
Datos Financieros:
- Precios de acciones, tipos de cambio, etc., que pueden registrarse cada minuto, cada hora, o en cualquier otro intervalo de tiempo.
-
Datos de Telemetr铆a:
- Informaci贸n proveniente de sensores en tiempo real, como la velocidad de un autom贸vil, la altitud de un avi贸n, etc.
Ejemplos de lo que no es una serie de tiempo
-
Registros 脷nicos de Transacciones:
- Datos que representan eventos 煤nicos y no parte de una serie de eventos que se desarrollan a lo largo del tiempo.
-
Datos Demogr谩ficos:
- Informaci贸n sobre individuos o grupos que no est谩 necesariamente vinculada a una estampa de tiempo espec铆fica, como edad, g茅nero, educaci贸n, etc.
-
Grafos de Conexiones o Redes:
- Informaci贸n que representa las relaciones entre diferentes entidades, donde el enfoque principal est谩 en la relaci贸n en s铆 misma y no en c贸mo cambia esa relaci贸n con el tiempo.
Requisitos
- Contar con MongoDB a partir de la versi贸n 5.0
- Establecer un modelo de datos que tenga las siguientes caracter铆sticas:
-
Timestamp
(estampa de tiempo): La fecha y hora en la que fue capturado el dato -
Metadata
(se refiere a los datos fuente): es una etiqueta que identifica de forma 煤nica la serie y generalmente no cambia -
Measurements
(se refiere a las m茅tricas o valores): Se trata de los valores registrados a trav茅s del tiempo
-
- Crear la colecci贸n con las caracter铆sticas para que sea tratada como serie de tiempo
Modelo de datos a convertir
Vamos a convertir el siguiente modelo de datos a una serie de tiempos de MongoDB:
{
"station_id": "12345",
"location": {
"type": "Point",
"coordinates": [-70.6506, -33.4378]
},
"timestamp": ISODate("2023-09-08T12:34:56Z"),
"temperature": 22.5,
"humidity": 65.0,
"pressure": 1013.2,
"wind": {
"speed": 10.5,
"direction": 220.0
},
"precipitation": {
"last_hour": 0.0,
"last_24_hours": 1.2
},
"conditions": "Sunny",
"alerts": [
{
"type": "Heat Warning",
"description": "Temperatures are expected to rise above 30掳C today.",
"start": ISODate("2023-09-08T00:00:00Z"),
"end": ISODate("2023-09-08T23:59:59Z")
}
]
}
Este modelo de datos permite almacenar una amplia variedad de datos meteorol贸gicos de una manera que facilita tanto el almacenamiento como la consulta de los datos. Los datos se almacenan en un formato que facilita la realizaci贸n de consultas temporales, y se pueden realizar consultas geogr谩ficas gracias al uso de GeoJSON para almacenar la ubicaci贸n. En este modelo de datos:
-
station_id
: Es el identificador 煤nico de la estaci贸n meteorol贸gica que registr贸 los datos. -
location
: Es un objeto GeoJSON que almacena la ubicaci贸n de la estaci贸n meteorol贸gica. -
timestamp
: Es la estampa de tiempo que indica cu谩ndo fueron capturados los datos. -
temperature
: Es la temperatura registrada en grados Celsius. -
humidity
: Es la humedad relativa registrada en porcentaje. -
pressure
: Es la presi贸n atmosf茅rica registrada en hectopascales (hPa). -
wind
: Es un objeto que almacena la velocidad y la direcci贸n del viento. -
speed
: Es la velocidad del viento en km/h. -
direction
: Es la direcci贸n del viento en grados. -
precipitation
: Es un objeto que almacena la cantidad de precipitaci贸n. -
last_hour
: Es la cantidad de precipitaci贸n en la 煤ltima hora en mm. -
last_24_hours
: Es la cantidad de precipitaci贸n en las 煤ltimas 24 horas en mm. -
conditions
: Es una descripci贸n textual de las condiciones meteorol贸gicas. -
alerts
: Es un array que puede contener cero o m谩s alertas meteorol贸gicas. -
type
: Es el tipo de alerta. -
description
: Es una descripci贸n de la alerta. -
start
: Es la fecha y hora de inicio de la alerta. -
end
: Es la fecha y hora de fin de la alerta.
Conversi贸n a serie de tiempo de MongoDB
Para utilizar el modelo de datos proporcionado en una colecci贸n de series temporales de MongoDB, se tiene que hacer algunas modificaciones para ajustarlo a las caracter铆sticas espec铆ficas y requisitos de las series temporales en MongoDB. Aqu铆 est谩 el modelo modificado:
{
"metadata": {
"station_id": "12345",
"location": {
"type": "Point",
"coordinates": [-70.6506, -33.4378]
}
},
"timestamp": ISODate("2023-09-08T12:34:56Z"),
"measurements": {
"temperature": 22.5,
"humidity": 65.0,
"pressure": 1013.2,
"wind_speed": 10.5,
"wind_direction": 220.0,
"precipitation_last_hour": 0.0,
"precipitation_last_24_hours": 1.2
},
"conditions": "Sunny",
"alerts": [
{
"type": "Heat Warning",
"description": "Temperatures are expected to rise above 30掳C today.",
"start": ISODate("2023-09-08T00:00:00Z"),
"end": ISODate("2023-09-08T23:59:59Z")
}
]
}
Cambios realizados
-
Metadatos agrupados
: Los campos de metadatos (station_id
ylocation
) se han agrupado bajo un 煤nico campometadata
. Esto se alinea con la recomendaci贸n de MongoDB de agrupar los metadatos en un campo separado. -
Mediciones agrupadas
: Los campos individuales de medici贸n se han agrupado bajo un campomeasurements
para mantener una estructura m谩s organizada. -
Flatten Nested Objects
: Los objetos anidados parawind
yprecipitation
se han "aplanado" para facilitar las consultas y el an谩lisis.
Creaci贸n de la colecci贸n
Al crear la colecci贸n de series temporales en MongoDB, se debe especificar timestamp
como el campo de tiempo y metadata
como el campo de metadatos. A continuaci贸n te ense帽o a crear la colecci贸n:
db.createCollection("weather_data", {
timeseries: {
timeField: "timestamp",
metaField: "metadata",
granularity: "hours"
}
})
Del comando anterior:
-
timeField
: Es el campo que contiene la estampa de tiempo de cada documento (registro de datos). -
metaField
: Es el campo que contiene los metadatos que son compartidos entre m煤ltiples documentos en la colecci贸n. -
granularity
: Es una opci贸n para definir el nivel de granularidad del bucketing. He elegido "hours" aqu铆, pero puedes ajustarlo seg煤n tus necesidades.
Inserci贸n de datos
Ahora que ya hemos creado nuestra colecci贸n de series de tiempo podemos insertar datos:
db.weather_data.insertOne({
"metadata": {
"station_id": "12345",
"location": {
"type": "Point",
"coordinates": [-70.6506, -33.4378]
}
},
"timestamp": ISODate("2023-09-08T12:34:56Z"),
"measurements": {
"temperature": 22.5,
"humidity": 65.0,
"pressure": 1013.2,
"wind_speed": 10.5,
"wind_direction": 220.0,
"precipitation_last_hour": 0.0,
"precipitation_last_24_hours": 1.2
},
"conditions": "Sunny",
"alerts": [
{
"type": "Heat Warning",
"description": "Temperatures are expected to rise above 30掳C today.",
"start": ISODate("2023-09-08T00:00:00Z"),
"end": ISODate("2023-09-08T23:59:59Z")
}
]
})
Conclusiones
Como pudimos ver, las series de tiempo est谩n pensadas para contener una gran cantidad de datos en periodos de tiempo cortos. En MongoDB tenemos varias herramientas para trabajar con series de tiempo, una de esas caracter铆sticas es el uso de TTL (tiempo de vida de los datos) para ir borrando una vez que expira su tiempo de vida, para lograr esto tenemos que definirlo en la creaci贸n de la colecci贸n:
db.createCollection("weather_data", {
timeseries: {
timeField: "timestamp",
metaField: "metadata",
granularity: "hours"
},
expireAfterSeconds: 86400
})
Evidentemente el uso de esta caracter铆stica de MongoDB radica en la compresi贸n de los datos ya que seg煤n con su documentaci贸n, el algoritmo de compresi贸n de los datos es bajo la librer铆a zstd que es m谩s eficiente que snappy.
Las ventajas de uso de las series de tiempo son:
-
Optimizaci贸n de Almacenamiento
-
Compresi贸n
: MongoDB 5.0 introduce mejoras significativas en la compresi贸n de datos de series temporales, permitiendo almacenar m谩s datos en menos espacio. -
Esquema
flexible: Puedes aprovechar el modelo de documentos de MongoDB para estructurar datos de series temporales de una manera que facilite las consultas y el an谩lisis.
-
-
Facilidad de Escalabilidad
-
Sharding
: MongoDB soporta sharding, lo que facilita la escalabilidad horizontal para manejar grandes vol煤menes de datos. -
Replicaci贸n
: La replicaci贸n en MongoDB asegura la disponibilidad y la redundancia de los datos.
-
-
Consultas Eficientes
-
脥ndices
: MongoDB permite crear 铆ndices sobre campos espec铆ficos, facilitando consultas r谩pidas y eficientes. -
Aggregation
Framework: El framework de agregaci贸n de MongoDB es potente y puede ser muy 煤til para analizar datos de series temporales.
-
-
Integraci贸n con Herramientas de An谩lisis
-
Conectores
: MongoDB ofrece conectores para varias herramientas populares de an谩lisis de datos y BI, facilitando la integraci贸n con tu stack de herramientas existente.
-
Si quieres profundizar en el manejo de series de tiempo puedes encontrar documentaci贸n de MongoDB aqu铆. Espero que este art铆culo te aporte algo de conocimiento y lo uses en tus pr贸ximos proyectos.
Featured ones: