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

Migrar dados para uma coleção de séries temporais com um pipeline de agregação

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.

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
}
}
)
1

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 campo metaData à coleção weather_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
}
}
])
2

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ção timeseries para criar uma coleção de séries temporais weathernew no banco de dados mydatabase.

  • Define o campo metaData como o metaField da coleção weathernew.

  • Define o campo ts como o timeField da coleção weathernew.

    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.

3

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

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.

Dica

Voltar

Migrar dados

Nesta página