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
$addFields
para adicionar um campometaData
à coleçãoweather_data
.Usa
$project
para 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
$out
com a opçãotimeseries
para criar uma coleção de séries temporaisweathernew
no banco de dadosmydatabase
.Define o campo
metaData
como ometaField
da coleçãoweathernew
.Define o campo
ts
como otimeField
da coleçãoweathernew
.Observação
O
timeField
de 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 } }
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
.