Utilice los siguientes pasos para migrar datos de una colección existente a una colección de series de tiempo con mongodumpymongorestore.
Pasos
Crear una nueva colección de series temporales.
Para crear un nuevo colección de series de tiempo, emita el siguiente comando mongosh en:
db.createCollection( "weathernew", { timeseries: { timeField: "ts", metaField: "metaData", granularity: "hours" } } )
Este ejemplo utiliza datos de muestra timeField metaFieldpara,granularity y. Para obtener más información sobre el comando anterior, consulte Crear una colección de series temporales.
(Opcional) Transforme sus datos.
Las colecciones de series temporales admiten índices secundarios en el campo especificado metaField como. Si el modelo de datos de sus series temporales no tiene un campo designado para sus metadatos, puede transformar los datos para crear uno. Para transformar los datos de su colección existente, utilice para crear una colección temporal con sus series $out temporales.
Consideremos 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 correcto como serie temporal metaField y granularity optimiza tanto el almacenamiento como el rendimiento de las consultas. Para obtener más información sobre la selección de campos y las prácticas recomendadas, consulte las prácticas recomendadas de metaField y granularidad.
La siguiente pipeline realiza las siguientes operaciones:
Utiliza para agregar
$addFieldsunmetaDatacampo a laweather_datacolección.Utiliza para incluir o excluir los campos restantes en el
$projectdocumento.Utiliza para crear una colección
$outtemporaltemporarytimeseriesllamada.
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, tendrá una colección intermedia temporarytimeseries:
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 sus datos desde una colección existente que no sea del tipo,timeseries mongodumputilice.
Advertencia
Al migrar o reponer datos en una colección de series temporales, inserte siempre los documentos en orden, del más antiguo al más reciente. En este caso, mongodump exporta los documentos en orden natural y la --maintainInsertionOrder opción para garantiza el mismo orden de mongorestore inserción.
Por ejemplo, para exportar la colección temporarytimeseries, emita el siguiente comando:
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 sus datos a una colección de series temporales,mongorestore utilice.
Importante
Asegúrese de ejecutar el mongorestore comando con la --noIndexRestore opción. mongorestore no puede crear índices en colecciones de series de tiempo.
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
Agregar índices secundarios a colecciones de series temporales
Si inserta un documento en una colección con un timeField valor antes de 1970-01-01T00:00:00.000Z o después 2038-01-19T03:14:07.000Z de, MongoDB registra una advertencia e impide que algunas optimizaciones de consultas utilicen el índice interno. Cree un índice secundario en timeField para recuperar el rendimiento de las consultas y resolver la advertencia del registro.