Definir granularidade para dados de série temporal
Nesta página
Quando você cria uma coleção de séries temporais, o MongoDB cria automaticamente uma system.buckets
coleção de sistema e agrupa dados de séries temporais de entrada em buckets. Ao definir a granularidade, você controla a frequência com que os dados são agrupados com base na taxa de ingestão dos dados.
A partir do MongoDB 6.3, você pode usar os parâmetros personalizados de agrupamento bucketMaxSpanSeconds
e bucketRoundingSeconds
para especificar os limites do bucket e controlar com mais precisão como os dados de séries temporais são agrupados.
Observação
Você deve estar executando o MongoDB 5.0.1 ou posterior para alterar a granularidade de uma coleção de séries temporais após a criação da coleção. Consulte Problemas conhecidos do MongoDB 5.0.
Recuperar os parâmetros de bucketing atuais
Para recuperar valores de collections atuais, use o comando listCollections
:
db.runCommand( { listCollections: 1 } )
Para coleções de séries temporais, a saída contém parâmetros granularity
, bucketMaxSpanSeconds
e bucketRoundingSeconds
, se presente.
{ cursor: { id: <number>, ns: 'test.$cmd.listCollections', firstBatch: [ { name: <string>, type: 'timeseries', options: { expireAfterSeconds: <number>, timeseries: { timeField: <string>, metaField: <string>, granularity: <string>, bucketMaxSpanSeconds: <number>, bucketRoundingSeconds: <number> } }, ... }, ... ] } }
Usando o parâmetro de "granularidade"
A tabela abaixo mostra o intervalo de tempo máximo incluído em um bucket de dados ao utilizar um determinado valor granularity
:
granularity | granularity limite de bucket |
---|---|
| 1 hora |
| 24 horas |
| 30 dias |
Por padrão, granularity
é definido como seconds
. Você pode melhorar o desempenho definindo o valor granularity
para a correspondência mais próxima ao intervalo de tempo entre as medições recebidas da mesma fonte de dados. Por exemplo, se você estiver gravando dados meteorológicos de milhares de sensores, mas apenas registrando dados de cada sensor uma vez a cada 5 minutos, defina granularity
como "minutes"
.
db.createCollection( "weather24h", { timeseries: { timeField: "timestamp", metaField: "metadata", granularity: "minutes" }, expireAfterSeconds: 86400 } )
Definir granularity
para hours
grupo até um mês de eventos de ingestão de dados em um único bucket, resultando em tempos de travessia mais longos e queries mais lentas. Defini-lo como seconds
leva a vários buckets por intervalo de pesquisa, muitos dos quais podem conter apenas um único documento.
Veja também:
Como usar parâmetros de bucketing personalizados
No MongoDB 6.3 e superior, em vez de granularity
, você pode definir os limites dos buckets manualmente usando os dois parâmetros de buckets personalizados. Considere essa abordagem se você espera fazer consulta de dados para intervalos de tempo fixos, como a cada 4 horas a partir da meia-noite. Garantir que os buckets não se sobreponham entre esses períodos otimiza o alto volume de consultas e as operações insert
.
Para utilizar parâmetros de bucket personalizados, defina ambos os parâmetros para o mesmo valor e não configure granularity
:
bucketMaxSpanSeconds
Define o tempo máximo entre os carimbos de data/hora no mesmo bucket. Os valores possíveis são 1-31536000.bucketRoundingSeconds
Define o intervalo de tempo que determina o carimbo de data/hora inicial para um novo bucket. Quando um documento requer um novo bucket, o MongoDB arredonda para baixo o valor do carimbo de data/hora do documento por esse intervalo para definir o tempo mínimo para o bucket.
Para o exemplo da estação meteorológica, se você gerar relatórios de resumo a cada 4 horas, poderá ajustar o bucketing definindo os parâmetros de bucketing personalizados em 14400 segundos em vez de usar granularity
de "minutes"
:
db.createCollection( "weather24h", { timeseries: { timeField: "timestamp", metaField: "metadata", bucketMaxSpanSeconds: 14400, bucketRoundingSeconds: 14400 } } )
Se um documento com um tempo de 2023-03-27T16:24:35Z
não se encaixa em um bloco existente, o MongoDB cria um novo bloco com um mínimo de tempo de 2023-03-27T16:00:00Z
e um tempo máximo de 2023-03-27T19:59:59Z
.
Alterar granularidade da série temporal
Você pode aumentar o timeseries.granularity
de uma unidade de tempo mais curta para uma mais longa utilizando um comando collMod
.
db.runCommand( { collMod: "weather24h", timeseries: { granularity: "seconds" | "minutes" | "hours" } } )
Se você estiver usando os parâmetros de bucketing personalizados bucketRoundingSeconds
e bucketMaxSpanSeconds
em vez de granularity
, inclua ambos os parâmetros personalizados no comando collMod
e defina-os com o mesmo valor:
db.runCommand( { collMod: "weather24h", timeseries: { bucketRoundingSeconds: 86400, bucketMaxSpanSeconds: 86400 } } )
Você não pode diminuir o intervalo de granularidade ou os valores de agrupamento personalizados.
Observação
Para modificar a granularidade de uma coleção de séries temporais compartilhada, você deve estar executando MongoDB 6.0 ou posterior.