Menu Docs
Página inicial do Docs
/
Manual do banco de dados
/ / /

Migrar dados para uma coleção de séries temporais com Database Tools

Siga as etapas abaixo para migrar dados de uma coleção existente para uma coleção de séries temporais usando mongodump e mongorestore.

1

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.

2

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 campo metaData à coleção weather_data.

  • Usa $project para incluir ou excluir os campos restantes no documento.

  • Usa $out para criar uma coleção temporária chamada temporarytimeseries.

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"
}
}
3

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)
4

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.

Voltar

Usar agregação

Nesta página