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
$addFields
para adicionar um campometaData
à coleçãoweather_data
.Usa
$project
para incluir ou excluir os campos restantes no documento.Usa
$out
para 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.