A partir de la versión 7.0 de MongoDB, puedes utilizar el $out etapa de agregación para migrar datos de una colección existente a una colección de series de tiempo.
Nota
MongoDB no garantiza el orden de salida cuando se utiliza $out para migrar datos a una colección de series de tiempo. Para mantener el orden, ordena tus datos antes de migrarlos con un pipeline de agregación.
Antes de comenzar
Considera una colección weatherdata que contenga información de tiempo y metadatos:
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 } } )
Pasos
Crea un campo de metadatos.
Si tu colección no incluye un campo que puedas utilizar para identificar cada serie, transforma tus datos para definir uno. En este ejemplo, el campo metaData se convierte en el metaField de la colección de series de tiempo que se crea.
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
$addFieldspara agregar un campometaDataa la colecciónweather_data.Usa
$projectpara incluir o excluir los campos restantes en el documento.
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 } } ])
Crea tu colección de series de tiempo e inserta tus datos.
Agregue una $out etapa de agregación a su pipeline para crear una colección de series temporales e insertar sus datos en ella. El pipeline a continuación realiza las siguientes operaciones:
Utiliza
$outcon la opcióntimeseriespara crear una colección de series de tiempoweathernewen la base de datosmydatabase.Define el campo
metaDatacomo elmetaFieldde la colecciónweathernew.Define el campo
tscomo eltimeFieldde la colecciónweathernew.Nota
El
timeFieldde una colección de series de tiempo debe ser de tipo fecha.
{ $out: { db: "mydatabase", coll: "weathernew", timeseries: { timeField: "ts", metaField: "metaData", granularity: "seconds" } } }
Para la sintaxis de la etapa de agregación, consulta $out. Para obtener una explicación completa de las opciones de series temporales, consulte la Referencia de campos de series temporales.
Revisa tus datos.
Después de ejecutar esta secuencia de agregación, puede usar para ver un documento en findOne() su weathernew colección de series de tiempo:
db.weathernew.findOne()
La operación devuelve el siguiente documento:
{ _id: ObjectId("5553a998e4b02cf7151190b8"), ts: ISODate("1984-03-05T13:00:00Z"), metaData: { st: "x+47600-047900", position: { type: "Point", coordinates: [ -47.9, 47.6 ] }, elevation: 9999, callLetters: "VCSZ", qualityControlProcess: "V020", type: "FM-13" }, 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 } }
Para obtener más información sobre consideraciones adicionales para migrar sus datos,consulte Mejores prácticas para colecciones de series de tiempo.
Próximos pasos
Si tu colección original tenía índices secundarios, vuelve a crearlos manualmente ahora.
Si tu colección de series de tiempo incluye timeField valores 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 hacen uso del índice clusterizado interno. Para recuperar el rendimiento de la query y resolver la advertencia de registro, crea un índice secundario en el timeField.