Siga as etapas abaixo para migrar dados de uma coleção existente para uma coleção de séries temporais usando mongodump e mongorestore.
Passos
Crie uma nova coleção de séries temporais.
Para criar uma nova coleção de séries temporais, emita o seguinte comando no mongosh:
db.createCollection( "weathernew", { timeseries: { timeField: "ts", metaField: "metaData", granularity: "hours" } } )
Este exemplo usa dados de amostra para timeField, metaField e granularity. Para obter mais informações sobre o comando anterior, consulte Criar uma coleção de séries temporais.
(Opcional) Transformar seus dados.
As coleções de séries temporais oferecem suporte a índices secundários no campo especificado como metaField. Se o modelo de dados dos seus dados de série temporal não tiver um campo designado para os seus metadados, você pode transformar seus dados para criar um. Para transformar os dados na sua coleção existente, utilize $out para criar uma coleção temporária com seus dados de séries temporais.
Considere uma collection com dados meteorológicos do seguinte formato:
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 } } )
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.Usa
$outpara criar uma coleção temporária chamadatemporarytimeseries.
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: "temporarytimeseries" } ])
Após executar este comando, você tem uma collection temporarytimeseries intermediária:
db.temporarytimeseries.findOne() { "_id" : ObjectId("5553a998e4b02cf7151190b8"), "ts" : ISODate("1984-03-05T13:00:00Z"), "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 }, "metaData" : { "st" : "x+47600-047900", "position" : { "type" : "Point", "coordinates" : [ -47.9, 47.6 ] }, "elevation" : 9999, "callLetters" : "VCSZ", "qualityControlProcess" : "V020", "type" : "FM-13" } }
Exporte sua coleção original.
Para exportar seus dados de uma coleção existente que não seja do tipo timeseries, utilize mongodump.
Aviso
Ao migrar ou preencher dados em uma coleção de séries temporais, sempre insira os documentos em ordem, do mais antigo para o mais recente. Neste caso, mongodump exporta documentos em ordem natural, e a opção --maintainInsertionOrder para mongorestore garante a mesma ordem de inserção dos documentos.
Por exemplo, para exportar a collection temporarytimeseries, emita o seguinte comando:
mongodump --uri="mongodb://mongodb0.example.com:27017,mongodb1.example.com:27017,mongodb2.example.com:27017/weather" \ --collection=temporarytimeseries --out=timeseries
O comando retorna a seguinte saída:
2021-06-01T16:48:39.980+0200 writing weather.temporarytimeseries to timeseries/weather/temporarytimeseries.bson 2021-06-01T16:48:40.056+0200 done dumping weather.temporarytimeseries (10000 documents)
Importe sua coleção.
Para importar seus dados para uma coleção de séries temporais, utilize mongorestore.
Importante
Certifique-se de executar o comando mongorestore com a opção --noIndexRestore. mongorestore não pode criar índices em coleções de séries temporais.
A seguinte operação importa timeseries/weather/temporarytimeseries.bson para a nova coleção weathernew:
mongorestore --uri="mongodb://mongodb0.example.com:27017,mongodb1.example.com:27017,mongodb2.example.com:27017/weather" \ --collection=weathernew --noIndexRestore \ --maintainInsertionOrder \ timeseries/weather/temporarytimeseries.bson
O comando retorna a seguinte saída:
2021-06-01T16:50:56.639+0200 checking for collection data in timeseries/weather/temporarytimeseries.bson 2021-06-01T16:50:56.640+0200 restoring to existing collection weather.weathernew without dropping 2021-06-01T16:50:56.640+0200 reading metadata for weather.weathernew from timeseries/weather/temporarytimeseries.metadata.json 2021-06-01T16:50:56.640+0200 restoring weather.weathernew from timeseries/weather/temporarytimeseries.bson 2021-06-01T16:51:01.229+0200 no indexes to restore 2021-06-01T16:51:01.229+0200 finished restoring weather.weathernew (10000 documents, 0 failures) 2021-06-01T16:51:01.229+0200 10000 document(s) restored successfully. 0 document(s) failed to restore.
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.
Dica
Adicionar índices secundários às Coleções de séries temporais
Se você inserir um documento em uma coleção com um valor timeField antes 1970-01-01T00:00:00.000Z ou depois 2038-01-19T03:14:07.000Z, o MongoDB registrará um aviso e impedirá que algumas otimizações de query usem o índice interno. Criar um índice secundário no timeField para recuperar o desempenho da query e resolver o aviso de log.