Dados do modelo de IoT
A internet das coisas (IoT) é uma rede de objetos físicos conectados à Internet. Muitos desses dispositivos, como sensores, geram dados.
Para armazenar e recuperar esses dados de forma eficiente, você pode usar o padrão de contêiner.
O padrão de bucket
Um método comum para organizar dados de IoT é grupo em buckets. O bucketing organiza grupos específicos de dados para ajudar:
Descubra tendências históricas,
Prever tendências futuras, e
Otimizar o uso do armazenamento.
Parâmetros comuns para agrupar dados são:
time
fonte de dados (se você tiver vários conjuntos de dados)
customer
tipo de dados (por exemplo, tipo de transação em dados financeiros)
Observação
A partir do MongoDB 5.0, ascoleções de séries temporais são o tipo de coleção recomendado para dados de séries temporais. Não use o padrão bucket em conjunto com coleções de séries temporais, pois isso pode prejudicar o desempenho.
Considere uma coleção que armazena os dados de temperatura obtidos de um sensor. O sensor registra a temperatura a cada minuto e armazena os dados em uma coleção chamada temperatures
:
// temperatures collection { "_id": 1, "sensor_id": 12345, "timestamp": ISODate("2019-01-31T10:00:00.000Z"), "temperature": 40 } { "_id": 2, "sensor_id": 12345, "timestamp": ISODate("2019-01-31T10:01:00.000Z"), "temperature": 40 } { "_id": 3, "sensor_id": 12345, "timestamp": ISODate("2019-01-31T10:02:00.000Z"), "temperature": 41 } ...
Essa abordagem não escala bem em termos de dados e tamanho do índice. Por exemplo, se o aplicativo exigir índices nos campos sensor_id
e timestamp
, cada leitura recebida do sensor precisará ser indexada para melhorar o desempenho.
Você pode aproveitar o modelo de documento para agrupar os dados em documentos que contêm as medidas para um período de tempo específico. Considere o seguinte esquema atualizado, que agrupa as leituras feitas a cada minuto em grupos de uma hora:
{ "_id": 1, "sensor_id": 12345, "start_date": ISODate("2019-01-31T10:00:00.000Z"), "end_date": ISODate("2019-01-31T10:59:59.000Z"), "measurements": [ { "timestamp": ISODate("2019-01-31T10:00:00.000Z"), "temperature": 40 }, { "timestamp": ISODate("2019-01-31T10:01:00.000Z"), "temperature": 40 }, ... { "timestamp": ISODate("2019-01-31T10:42:00.000Z"), "temperature": 42 } ], "transaction_count": 42, "sum_temperature": 1783 }
Este esquema atualizado melhora a escalabilidade e reflete como o aplicativo realmente utiliza os dados. O usuário provavelmente não fará uma query para obter uma leitura de temperatura específica. Em vez disso, o usuário provavelmente faria uma query do comportamento de temperatura ao longo de uma hora ou dia. O padrão de bucket facilita estas queries ao agrupar os dados em períodos de tempo uniformes.
Combine os padrões computados e de bucket
O documento de exemplo contém dois campos calculados: transaction_count
e sum_temperature
. Se o aplicativo precisar recuperar frequentemente a soma das temperaturas em uma determinada hora, calcular um total em execução da soma pode ajudar a economizar recursos do aplicativo. Essa abordagem de Padrão Computado elimina a necessidade de calcular a soma cada vez que os dados são solicitados.
Os valores sum_temperature
e transaction_count
pré-agregados permitem cálculos adicionais, como a temperatura média (sum_temperature
/ transaction_count
) para um bucket específico. É muito mais provável que os usuários consultem o aplicativo para a temperatura média entre 2:00 e 3:00, em vez de executar query da temperatura específica às 2:03. O agrupamento e o pré-cálculo de determinados valores permitem que o aplicativo forneça essas informações com mais facilidade.
Representações de tempo no MongoDB
O MongoDB armazena horas em UTC por padrão e converte quaisquer representações de hora local nesse formulário. Os aplicativos que devem operar ou relatar algum valor de hora local não modificado podem armazenar a zona ao lado do carimbo de data/hora UTC e calcular a hora local original em sua lógica de aplicativo.
Exemplo
Na concha MongoDB, você pode armazenar a data atual e o deslocamento do cliente atual a partir de UTC.
var now = new Date(); db.data.save( { date: now, offset: now.getTimezoneOffset() } );
Você pode reconstruir a hora local original aplicando o deslocamento salvo:
var record = db.data.findOne(); var localNow = new Date( record.date.getTime() - ( record.offset * 60000 ) );