Migrar dados para uma Coleção de séries temporais
Nesta página
Esta página descreve como migrar dados para uma coleção de séries temporais usando um pipeline de agregação. Como alternativa, para aprender a migrar dados para uma coleção de séries temporais usando o MongoDB Relational Migrator, consulte Configurar uma coleção de time series com o Relational Migrator.
Sobre esta tarefa
A partir da versão 7.0 do MongoDB, você pode usar o estágio de agregação $out
para migrar dados de uma coleção existente para uma coleção de séries temporais. Se sua coleção armazenar dados que você deseja comparar entre intervalos de tempo, use uma coleção de séries temporais para melhorar o desempenho e o armazenamento. Para obter mais informações sobre os benefícios das coleções de séries temporais, consulte Coleções de séries temporais.
Antes de começar
Considere uma coleção weatherdata
que contém informações de tempo e metadados:
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 } } )
Passos
Opcional. Crie um campo de metadados.
Se sua coleção não incluir um campo específico que contenha todos os metadados, transforme seus dados para definir um.
Os seguintes estágios do pipeline adicionam um campo metaData
e usam $project
para incluir ou excluir os campos restantes no documento. Neste exemplo, o campo metaData
se torna o metaField
da coleção de séries temporais que você cria.
Observação
Escolher o campo certo como seu metaField
de série temporal otimiza o desempenho do armazenamento e da query. Para obter mais informações sobre seleção de metaField
e práticas recomendadas, consulte metaFields.
{ $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 } }
Crie sua coleção de séries temporais e insira seus dados.
O exemplo abaixo executa as seguintes operações:
Usa o estágio de agregação
$addFields
para adicionar um campometaData
à sua coleçãoweather_data
.Usa o estágio de agregação
$out
com a opçãotimeseries
para criar uma coleção de séries temporaisweathernew
no banco de dadosmydatabase
.Define o
metaField
da sua coleçãoweathernew
como o campometaData
.Define o
timeField
da sua coleçãoweathernew
como o campots
.
Observação
O timeField
de uma coleção de séries temporais deve ser um tipo de data.
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" } } } ] )
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.
Depois de executar esse pipeline de agregação, você pode usar findOne()
para visualizar um documento em sua coleção de séries temporais weathernew
:
db.weathernew.findOne()
A operação retorna o seguinte 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 } }
Próximos passos
Se a sua coleção original tinha índices secundários, recrie-os manualmente agora.
Se sua coleção de séries temporais incluir valores timeField
antes de 1970-01-01T00:00:00.000Z
ou depois de 2038-01-19T03:14:07.000Z
, o MongoDB registrará um aviso e desabilitará algumas otimizações de consulta que fazem uso do índice clusterizado interno. Para recuperar o desempenho da consulta e resolver o aviso de log, crie um índice secundário em timeField
.