Migrar dados para uma Coleção de séries temporais
Nesta página
Para migrar dados de uma coleção existente para uma coleção de série temporal, use um estágio $out
em seu pipeline de agregação.
Observação
Nas versões do MongoDB anteriores a 7.0.3, um aggregation pipeline não pode usar $out
para gerar uma coleção de séries temporais. Para migrar dados para uma coleção de séries temporais com versões MongoDB anteriores a 7.0.3, use mongodump
e mongorestore
.
Migrar dados para uma Coleção de séries temporais
(Opcional) Transforme seus dados para criar um campo de metadados se não existir. Este campo não é obrigatório.
Se a coleção original não tiver um campo de metadados, utilize o estágio de agregação $addFields
para adicioná-la.
Considere uma coleção com dados meteorológicos que usa o formato:
{ "_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 } }
Os seguintes estágios do pipeline adicionam um campo metaData
e usam $project
para incluir ou excluir os campos restantes no documento:
{ $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 } }
Use a opção de série temporal com o estágio de agregação $out
O exemplo abaixo utiliza o método auxiliar db.collection.aggregate()
. Para a sintaxe de estágio de agregação, consulte $out
. Para obter uma explicação completa das opções de séries temporais, consulte a Referência de campo de série temporal.
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: { db: "mydatabase", coll: "weathernew", timeseries: { timeField: "ts", metaField: "metaData" } } } ])
Após executar este comando, você tem a coleção weathernew
abaixo:
db.weathernew.findOne() { "_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 } }
Se a sua coleção original tinha índices secundários, recrie-os manualmente agora. Se a sua coleção incluir timeField
valores antes de 1970-01-01T00:00:00.000Z
ou depois de 2038-01-19T03:14:07.000Z
, o MongoDB registrará um aviso e desativará algumas otimizações de query que fazem uso do índice interno agrupado. Criar um índice secundário no timeField
para recuperar o desempenho da query e resolver o aviso de log.