Explore o novo chatbot do Developer Center! O MongoDB AI chatbot pode ser acessado na parte superior da sua navegação para responder a todas as suas perguntas sobre o MongoDB .

Junte-se a nós no Amazon Web Services re:Invent 2024! Saiba como usar o MongoDB para casos de uso de AI .
Desenvolvedor do MongoDB
Central de desenvolvedor do MongoDBchevron-right
Produtoschevron-right
MongoDBchevron-right

Novas coleções de séries temporais do MongoDB

Mark Smith, Michael Gargiulo8 min read • Published Jul 13, 2021 • Updated Sep 09, 2024
MongoDBTime Series
Ícone do FacebookÍcone do Twitterícone do linkedin
Avalie esse anúncio
star-empty
star-empty
star-empty
star-empty
star-empty

O que são dados de séries temporais?

Os dados de séries temporais são medições feitas em intervalos de tempo. Às vezes, dados de séries temporais entram em seu banco de dados com alta frequência — casos de uso como transações financeiras, dados do mercado de ações, leituras de medidores inteligentes ou métricas de serviços que você está hospedando em centenas ou até milhares de servidores. Em outros casos, cada medição pode ocorrer apenas a cada poucos minutos. Talvez você esteja monitorando o número de servidores que está executando a cada poucos minutos para estimar seus custos de servidor para o mês. Talvez você esteja medindo a umidade do solo de sua planta favorita uma vez por dia.
FrequenteInfrequente
RegularMétricas de serviçoNúmero de sensores que fornecem métricas meteorológicas
IrregularTransações financeiras, preços de ações?Dados LPWAN
No entanto, quando se trata de dados de séries temporais, não se trata apenas de frequência, a única coisa que realmente importa é a presença do tempo. Não importa se seus dados chegam a cada segundo, a cada 5 minutos ou a cada hora, isso não prejudicará o uso do MongoDB para armazenar e trabalhar com dados de séries temporais.

Exemplos de dados de séries temporais

Desde o início, os desenvolvedores têm usado o MongoDB para armazenar dados de séries temporais. O MongoDB pode ser um mecanismo extremamente eficiente para armazenar e processar dados de séries temporais, mas é preciso saber como modelá-lo corretamente para que ele funcione como o esperado.
Começando no MongoDB 5.0, há um novo tipo de coleção, as coleções de séries temporais, que são especificamente projetadas para armazenar e trabalhar com dados de séries temporais sem o incômodo ou a necessidade de se preocupar com a otimização de modelos de baixo nível.

O que são coleções de séries temporais?

As coleções de séries temporais são um novo tipo de coleção introduzido no MongoDB 5.0. Superficialmente, essas coleções se parecem com qualquer outra coleção no MongoDB. Você pode ler e gravar neles da mesma forma que faz com coleções regulares e até mesmo criar índices secundários com o comando createIndex. No entanto, internamente, eles são suportados nativamente e otimizados para armazenar e trabalhar com dados de séries temporais.
Na prática, a criação de uma coleção de séries temporais resulta em uma coleção e em uma visualização não materializada gravável criada automaticamente que serve como uma camada de abstração. Essa camada de abstração permite que você sempre trabalhe com seus dados como documentos únicos em sua forma bruta, sem se preocupar com implicações de desempenho, pois a coleção de séries temporais implementa uma forma do padrão de bucket que você já conhece ao persistir dados em disco. Mas você não precisa mais se preocupar com esses detalhes ao projetar seu esquema ou ler e gravar seus dados. Os usuários sempre poderão trabalhar com a camada de abstração e não com um documento complicado compactado e agrupado em buckets.

Por que usar as coleções de séries temporais do MongoDB?

Bem, porque você tem dados de séries de temporais, certo?
É claro que isso pode ser verdade, mas há muito mais motivos para usar as novas coleções de séries temporais em vez de coleções regulares para dados de séries temporais.
A facilidade de uso, o desempenho e a eficiência do armazenamento foram objetivos fundamentais ao criar as coleções de séries temporais. As coleções de séries temporais, como qualquer outra coleção, permitem o trabalho com modelo de dados como documentos individuais, com tipos e estruturas de dados avançados. Também eliminam a necessidade de modelar seus dados de série temporal de forma que eles apresentem alto desempenho antes do tempo - as coleções de séries temporais tratam de tudo isso para você!
Você pode projetar seus modelos de documentos de forma mais intuitiva, da mesma forma que faria com outros tipos de coleções do MongoDB. Em seguida, o banco de dados otimiza o esquema de armazenamento para ingestão, recuperação e armazenamento, fornecendo compressão nativa para permitir que você armazene com eficiência seus dados de série temporal sem se preocupar com campos duplicados com suas medições.
Apesar de ter sido implementado de uma forma diferente das coleções que você usou antes, para otimizar os documentos com registro de data e hora, é importante lembrar que você ainda pode usar os recursos do MongoDB que conhece e adora, incluindo coisas como aninhamento de dados dentro de documentos, índices secundários e toda a amplitude das funções de análise e transformação de dados dentro do framework de agregação, incluindo a junção de dados de outras coleções, usando o operador $lookup e criando visualizações materializadas usando $merge.

Como criar uma coleção de séries temporais

Só é preciso tempo 

Criar uma coleção de séries temporais é simples, basta passar o novo campo "timeseries" para o comando createCollection e você estará pronto. No entanto, antes de avançarmos muito,  vamos explicar como fazer isso e todas as opções que permitem otimizar as coleções de séries temporais.
Ao longo desta postagem, mostraremos como criar uma coleção de séries temporais para armazenar documentos com a seguinte aparência:
1{
2 "_id" : ObjectId("60c0d44894c10494260da31e"),
3 "source" : {sensorId: 123, region: "americas"},
4 "airPressure" : 99 ,
5 "windSpeed" : 22,
6 "temp" : { "degreesF": 39,
7 "degreesC": 3.8
8 },
9 "ts" : ISODate("2021-05-20T10:24:51.303Z")
10}
Conforme mencionado anteriormente, uma coleção de séries temporais pode ser criada com apenas um campo de tempo simples. Para armazenar documentos como esse em uma coleção de séries temporais, podemos passar o seguinte para o comando createCollection :
1db.createCollection("weather", {
2 timeseries: {
3 timeField: "ts",
4 },
5});
Você provavelmente não ficará surpreso ao saber que a opção timeField declara o nome do campo em seus documentos que armazena a hora; no exemplo acima, "ts" é o nome do timeField. O valor do campo especificado por timeField deve ser um 
tipo de data
.
Muito rápido, certo? Embora as coleções de séries temporais exijam apenas um timeField, existem outros parâmetros opcionais que podem ser especificados na criação ou, em alguns casos, no momento da modificação, o que permitirá que você obtenha o máximo de suas coleções de séries temporais. Esses parâmetros opcionais são metaField, granularidade e expireAfterSeconds.

metaField

Embora não seja um parâmetro obrigatório, o MetaField permite uma melhor otimização quando especificado, incluindo a capacidade de criar índices secundários.
1db.createCollection("weather", {
2 timeseries: {
3 timeField: "ts",
4 metaField: "source",
5 }});
No exemplo acima, o metaField seria o campo "source":
1"source" : {sensorId: 123, region: "americas"}
Esse é um objeto que consiste em pares de valores-chave que descrevem nossos dados de série temporal Neste exemplo, um ID de identificação e localização para um sensor que coleta dados meteorológicos.
O campo metaField pode ser um documento complicado com campos aninhados, um objeto ou até mesmo um único GUID, ou string. O ponto importante aqui é que o metaField faz referência a metadados que servem como um rótulo ou tag, o que permite identificar exclusivamente a origem de uma série temporal. Esse campo deve mudar raramente ao longo do tempo, ou nunca sofrer nenhuma alteração. 
Recomenda-se sempre especificar um metaField, mas você deve usá-lo especialmente quando tiver várias fontes de dados, como sensores ou dispositivos que compartilham medições comuns.
O metaField, se presente, deve particionar os dados de série temporal, de modo que as medições com os mesmos metadados se relacionam ao longo do tempo. As medições com um metaField comum por períodos de tempo serão agrupadas internamente para eliminar a duplicação desse campo na camada de armazenamento. A ordem dos campos de metadados é ignorada para acomodar drivers e aplicativos que representam objetos como mapas não ordenados. Dois campos de metadados com o mesmo conteúdo, mas ordem diferente são considerados idênticos. 
Assim como o timeField, o metaField é especificado como o nome do campo de nível superior ao criar uma coleção. No entanto, o metaField pode ser de qualquer tipo de dados BSON, exceto array, e não pode corresponder ao timeField exigido pelas coleções de séries temporais. Ao especificar o metaField, especifique o nome do campo de nível superior como uma string, independentemente da estrutura subjacente ou do tipo de dados.
Os dados no mesmo período de tempo e com o mesmo metaField serão colocados no disco/SSD, portanto, a escolha do campo metaField pode afetar o desempenho da consulta.

Granularidade

O parâmetro de granularidade representa uma string com as seguintes opções:
  • "segundos"
  • "minutos"
  • "horas"
1db.createCollection("weather", {
2 timeseries: {
3 timeField: "ts",
4 metaField: "source",
5 granularity: "minutes",
6 },
7});
A granularidade deve ser definida como a unidade mais próxima da taxa de ingestão para um valor metaField exclusivo. Assim, por exemplo, se a coleção descrita acima deve receber uma medida a cada 5 minutos de uma única fonte, você deve usar a granularidade "minutos", porque a fonte foi especificada como o metaField.
No primeiro exemplo, em que apenas o timeField foi especificado e nenhum metaField foi identificado (tente evitar isso!), a granularidade precisaria ser definida em relação à taxatotal de ingestão, em todas as fontes.
A granularidade deve ser pensada em relação à sua taxa de ingestão de metadados, e não apenas à taxa de ingestão geral. A especificação de um valor apropriado permite que a coleção de séries temporais seja otimizada para uso.
Por padrão, o MongoDB define a granularidade como "segundos", indicativo de uma taxa de ingestão de alta frequência ou quando nenhum metaField é especificado.

expireAfterSeconds

Os dados de séries temporais geralmente crescem a taxas muito altas e se tornam menos úteis à medida que envelhecem. Assim como as sobras da semana passada ou o leite, você deve gerenciar o ciclo de vida dos dados e, muitas vezes, isso ocorre na forma de expiração de dados antigos.
Assim como os índices TTL, as coleções de séries temporais permitem gerenciar o ciclo de vida dos dados com a capacidade de excluir automaticamente dados antigos em um intervalo específico em segundo plano. No entanto, diferentemente dos índices TTL em coleções regulares, as coleções de séries temporais não exigem que você crie um índice para fazer isso. 
Basta especificar sua taxa de retenção em segundos durante o tempo de criação, como mostrado abaixo, ou modificá-la a qualquer momento após a criação com collMod. 
1db.createCollection("weather", {
2 timeseries: {
3 timeField: "ts",
4 metaField: "source",
5 granularity: "minutes"
6 },
7 expireAfterSeconds: 9000
8});
A expiração dos dados é simplesmente uma maneira para gerenciar o ciclo de vida dos dados que o MongoDB oferece nativamente para você. Em uma postagem futura, discutiremos maneiras de arquivar automaticamente seus dados e ler com eficiência os dados armazenados em vários locais por longos períodos de tempo usando o MongoDB Online Archive.

Juntando tudo 

Juntando tudo, mostramos como criar uma coleção de séries temporais e as diferentes opções que você pode e deve especificar para aproveitar ao máximo seus dados.
1{
2 "_id" : ObjectId("60c0d44894c10494260da31e"),
3 "source" : {sensorId: 123, region: "americas"},
4 "airPressure" : 99 ,
5 "windSpeed" : 22,
6 "temp" : { "degreesF": 39,
7 "degreesC": 3.8
8 },
9 "ts" : ISODate("2021-05-20T10:24:51.303Z")
10}
O documento acima pode agora ser armazenado e acessado de forma eficiente a partir de umacoleção de séries temporais usando o comando createCollection abaixo.
1db.createCollection("weather", {
2 timeseries: {
3 timeField: "ts",
4 metaField: "source",
5 granularity: "minutes"
6 },
7 expireAfterSeconds: 9000
8});
Embora esse seja apenas um exemplo, seu documento pode se parecer com quase qualquer coisa. Seu esquema é uma escolha sua, com a liberdade de não se preocupar com como esses dados são compactados e armazenados em disco. As otimizações serão feitas de forma automática e nativa para você.

Limitações das coleções de séries temporais no MongoDB 5.0

No lançamento inicial da coleção de séries temporais do MongoDB 5.0 existem algumas limitações. A mais notável dessas limitações é que as coleções de séries temporais são consideradas apenas anexações, portanto, não temos suporte no nível de abstração para operações de atualização e/ou exclusão. As operações de atualização e/exclusão ainda podem ser executadas em coleções de séries temporais, mas elas devem ir diretamente para a coleção armazenada no disco usando o formato de armazenamento otimizado e um usuário deve ter as permissões adequadas para executar essas operações.
Além da natureza somente de anexar, na versão inicial, as coleções de séries temporais não funcionarão com o Change Streams ou o Atlas Search. Por fim, as coleções de séries temporais permitem a criação de índices secundários, conforme discutido acima. No entanto, estes índices secundários só podem ser definidos no metaField e/ou timeField.
Para obter uma lista completa das limitações, consulte a página de documentação oficial do MongoDB.
Embora saibamos que algumas dessas limitações podem ser impactantes para o seu caso de uso atual, prometemos que estamos trabalhando nisso agora mesmo e gostaríamos muito que você desse seu feedback!

Próximos passos

Agora você sabe o que são dados de séries temporais, quando e como deve criar uma coleção de séries temporais e alguns detalhes de como definir parâmetros ao criar uma coleção. Que tal criar uma coleção de séries temporais agora? Nossa próxima postagem no blog abordará mais detalhes sobre como otimizar sua coleção de séries temporais para casos de uso específicos.
Talvez você esteja interessado em migrar de uma coleção existente para uma coleção de séries temporais! Abordaremos esse assunto em uma postagem posterior, mas, enquanto isso, consulte a documentação oficial para obter uma lista de ferramentas e exemplos de migração.

Ícone do FacebookÍcone do Twitterícone do linkedin
Avalie esse anúncio
star-empty
star-empty
star-empty
star-empty
star-empty
Relacionado
Início rápido

Criar, ler, atualizar e excluir documentos MongoDB com PHP


Sep 11, 2024 | 8 min read
Artigo

Java 21: desbloqueando o poder do driver Java MongoDB com threads virtuais


Jan 31, 2024 | 2 min read
Artigo

TableCheck: restaurantes habilitados com as melhores ferramentas de reserva da classe, desenvolvido pela MongoDB


Aug 28, 2024 | 4 min read
Tutorial

Crie uma API RESTful com o HapiJS e o MongoDB


Oct 01, 2024 | 15 min read
Sumário