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.
Observação
O MongoDB não garante a ordem de saída ao usar $out para migrar dados para uma coleção de séries temporais. Para manter a ordem, classifique seus dados antes de migrar com um pipeline de agregação.
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
Crie um campo de metadados.
Se sua coleção não incluir um campo que você possa usar para identificar cada série, transforme seus dados para definir um. 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 e grandularity de série temporal otimiza o desempenho do armazenamento e da query. Para obter mais informações sobre a seleção de campos e as melhores práticas, consulte MetaField e melhores práticas de granularidade.
O pipeline abaixo realiza as seguintes operações:
Utiliza
$addFieldspara adicionar um campometaDataà coleçãoweather_data.Usa
$projectpara incluir ou excluir os campos restantes no 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 } } ])
Crie sua coleção de séries temporais e insira seus dados.
Adicione um estágio de agregação $out ao seu pipeline para criar uma coleção de séries temporais e inserir seus dados nela. O pipeline abaixo executa as seguintes operações:
Utiliza
$outcom a opçãotimeseriespara criar uma coleção de séries temporaisweathernewno banco de dadosmydatabase.Define o campo
metaDatacomo ometaFieldda coleçãoweathernew.Define o campo
tscomo otimeFieldda coleçãoweathernew.Observação
O
timeFieldde uma coleção de séries temporais deve ser um tipo de data.
{ $out: { db: "mydatabase", coll: "weathernew", timeseries: { timeField: "ts", metaField: "metaData", granularity: "seconds" } } }
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.
Revise seus dados.
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 } }
Para obter mais informações sobre considerações adicionais para migrar seus dados, consulte Melhores práticas para coleções de séries temporais.
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.