Siga los siguientes pasos para migrar datos de una colección existente a una colección de series de tiempo con mongodump y mongorestore.
Pasos
Crea una nueva colección de series de tiempo.
Para crear un nuevo colección de series de tiempo, emita el siguiente comando en mongosh:
db.createCollection( "weathernew", { timeseries: { timeField: "ts", metaField: "metaData", granularity: "hours" } } )
Este ejemplo utiliza datos de muestra para timeField, metaField y granularity. Para más información sobre el comando anterior, consulta Crear una colección de series de tiempo.
(Opcional) Transforme sus datos.
Las colecciones de series de tiempo admiten índices secundarios en el campo especificado como el metaField. Si el modelo de datos de tus datos de series de tiempo no tiene un campo designado para tus metadatos, puedes transformar tus datos para crear uno. Para transformar los datos en tu colección existente, utiliza $out para crear una colección temporal con tus datos de series de tiempo.
Considera una colección con datos meteorológicos del siguiente formato:
db.weatherdata.insertOne( { _id: ObjectId("5553a998e4b02cf7151190b8"), st: "x+47600-047900", ts: ISODate("1984-03-05T13:00:00Z"), position: { type: "Point", coordinates: [ -47.9, 47.6 ] }, elevation: 9999, callLetters: "VCSZ", qualityControlProcess: "V020", dataSource: "4", type: "FM-13", airTemperature: { value: -3.1, quality: "1" }, dewPoint: { value: 999.9, quality : "9" }, pressure: { value: 1015.3, quality: "1" }, wind: { direction: { angle: 999, quality: "9" }, type: "9", speed: { rate: 999.9, quality: "9" } }, visibility: { distance: { value: 999999, quality : "9" }, variability: { value: "N", quality: "9" } }, skyCondition: { ceilingHeight: { value: 99999, quality: "9", determination: "9" }, cavok: "N" }, sections: [ "AG1" ], precipitationEstimatedObservation: { discrepancy: "2", estimatedWaterDepth: 999 } } )
Nota
Elegir el campo adecuado como serie de tiempo metaField y grandularity optimiza tanto el almacenamiento como el rendimiento de las query. Para obtener más información sobre la selección de campos y las mejores prácticas, consulta MetaField y Mejores prácticas de granularidad.
La siguiente pipeline realiza las siguientes operaciones:
Utiliza
$addFieldspara agregar un campometaDataa la colecciónweather_data.Usa
$projectpara incluir o excluir los campos restantes en el documento.Utiliza
$outpara crear una colección temporal llamadatemporarytimeseries.
db.weather_data.aggregate([ { $addFields: { metaData: { "st": "$st", "position": "$position", "elevation": "$elevation", "callLetters": "$callLetters", "qualityControlProcess": "$qualityControlProcess", "type": "$type" } }, }, { $project: { _id: 1, ts: 1, metaData: 1, dataSource: 1, airTemperature: 1, dewPoint: 1, pressure: 1, wind: 1, visibility: 1, skyCondition: 1, sections: 1, precipitationEstimatedObservation: 1 } }, { $out: "temporarytimeseries" } ])
Después de ejecutar este comando, tienes una colección temporarytimeseries intermedia:
db.temporarytimeseries.findOne() { "_id" : ObjectId("5553a998e4b02cf7151190b8"), "ts" : ISODate("1984-03-05T13:00:00Z"), "dataSource" : "4", "airTemperature" : { "value" : -3.1, "quality" : "1" }, "dewPoint" : { "value" : 999.9, "quality" : "9" }, "pressure" : { "value" : 1015.3, "quality" : "1" }, "wind" : { "direction" : { "angle" : 999, "quality" : "9" }, "type" : "9", "speed" : { "rate" : 999.9, "quality" : "9" } }, "visibility" : { "distance" : { "value" : 999999, "quality" : "9" }, "variability" : { "value" : "N", "quality" : "9" } }, "skyCondition" : { "ceilingHeight" : { "value" : 99999, "quality" : "9", "determination" : "9" }, "cavok" : "N" }, "sections" : [ "AG1" ], "precipitationEstimatedObservation" : { "discrepancy" : "2", "estimatedWaterDepth" : 999 }, "metaData" : { "st" : "x+47600-047900", "position" : { "type" : "Point", "coordinates" : [ -47.9, 47.6 ] }, "elevation" : 9999, "callLetters" : "VCSZ", "qualityControlProcess" : "V020", "type" : "FM-13" } }
Exporta tu colección original.
Para exportar tus datos desde una colección existente que no sea de tipo timeseries, utiliza mongodump.
Advertencia
Al migrar o completar una colección de series de tiempo, insertar siempre los documentos en orden, del más antiguo al más reciente. En este caso, mongodump exporta documentos en orden natural y la opción --maintainInsertionOrder paramongorestore garantiza el mismo orden de inserción para los documentos.
Por ejemplo, para exportar la colección temporarytimeseries, emitir el comando siguiente:
mongodump --uri="mongodb://mongodb0.example.com:27017,mongodb1.example.com:27017,mongodb2.example.com:27017/weather" \ --collection=temporarytimeseries --out=timeseries
El comando devuelve la siguiente salida:
2021-06-01T16:48:39.980+0200 writing weather.temporarytimeseries to timeseries/weather/temporarytimeseries.bson 2021-06-01T16:48:40.056+0200 done dumping weather.temporarytimeseries (10000 documents)
Importa tu colección.
Para importar tus datos en una colección de series temporales, utiliza mongorestore.
Importante
Asegúrese de ejecutar el comando mongorestore con la opción --noIndexRestore. mongorestore no puede crear índices en colecciones de series temporales.
La siguiente operación importa timeseries/weather/temporarytimeseries.bson a la nueva colección weathernew:
mongorestore --uri="mongodb://mongodb0.example.com:27017,mongodb1.example.com:27017,mongodb2.example.com:27017/weather" \ --collection=weathernew --noIndexRestore \ --maintainInsertionOrder \ timeseries/weather/temporarytimeseries.bson
El comando devuelve la siguiente salida:
2021-06-01T16:50:56.639+0200 checking for collection data in timeseries/weather/temporarytimeseries.bson 2021-06-01T16:50:56.640+0200 restoring to existing collection weather.weathernew without dropping 2021-06-01T16:50:56.640+0200 reading metadata for weather.weathernew from timeseries/weather/temporarytimeseries.metadata.json 2021-06-01T16:50:56.640+0200 restoring weather.weathernew from timeseries/weather/temporarytimeseries.bson 2021-06-01T16:51:01.229+0200 no indexes to restore 2021-06-01T16:51:01.229+0200 finished restoring weather.weathernew (10000 documents, 0 failures) 2021-06-01T16:51:01.229+0200 10000 document(s) restored successfully. 0 document(s) failed to restore.
Si tu colección original tenía índices secundarios, ahora recréalos manualmente. Si tu colección incluye valores timeField antes de 1970-01-01T00:00:00.000Z o después de 2038-01-19T03:14:07.000Z, MongoDB registra una advertencia y desactiva algunas optimizaciones de query que utilizan el índice interno agrupado. Crea un índice secundario en el timeField para recuperar el rendimiento de la query y resolver la advertencia del registro.
Tip
Agregue índices secundarios a las colecciones de series temporales
Si se inserta un documento en una colección con un valor timeField antes del 1970-01-01T00:00:00.000Z o después del 2038-01-19T03:14:07.000Z, MongoDB registra una advertencia e impide que ciertas optimizaciones de query aprovechen el índice interno. Crear un índice secundario en el timeField para restaurar el rendimiento de la query y resolver la advertencia del registro.