MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

MongoDB como um banco de dados de séries temporais


Obviamente, essa é uma pergunta antiga, mas me deparei com ela quando estava pesquisando o MongoDB para dados de séries temporais. Achei que valeria a pena compartilhar a seguinte abordagem para alocar documentos completos com antecedência e realizar operações de atualização, em vez de novas operações de inserção. Observe que essa abordagem foi documentada aqui e aqui.

Imagine que você está armazenando dados a cada minuto. Considere a seguinte estrutura de documento:
{
  timestamp: ISODate("2013-10-10T23:06:37.000Z"),
  type: ”spot_EURUSD”,
  value: 1.2345
},
{
  timestamp: ISODate("2013-10-10T23:06:38.000Z"),
  type: ”spot_EURUSD”,
  value: 1.2346
}

Isso é comparável a uma abordagem relacional padrão. Nesse caso, você produz um documento por valor registrado, o que causa muitas operações de inserção. Podemos fazer melhor. Considere o seguinte:
{
  timestamp_minute: ISODate("2013-10-10T23:06:00.000Z"),
  type: “spot_EURUSD”,
  values: {
    0: 1.2345,
    …  
    37: 1.2346,
    38: 1.2347,
    … 
    59: 1.2343
  }
}

Agora, podemos escrever um documento e realizar 59 atualizações. Isso é muito melhor porque as atualizações são atômicas, as gravações individuais são menores e há outros benefícios de desempenho e simultaneidade. Mas e se quiséssemos armazenar o dia inteiro, e não apenas as horas inteiras, em um documento. Isso exigiria que andássemos ao longo de 1440 entradas para obter o último valor. Para melhorar isso, podemos estender ainda mais para o seguinte:
{
  timestamp_hour: ISODate("2013-10-10T23:00:00.000Z"),
  type: “spot_EURUSD”,
  values: {
    0: { 0: 1.2343, 1: 1.2343, …, 59: 1.2343},
    1: { 0: 1.2343, 1: 1.2343, …, 59: 1.2343},
    …,
    22: { 0: 1.2343, 1: 1.2343, …, 59: 1.2343},
    23: { 0: 1.2343, 1: 1.2343, …, 59: 1.2343}
  }
}

Usando essa abordagem aninhada, agora só precisamos caminhar, no máximo, 24 + 60 para obter o último valor do dia.

Se construirmos os documentos com todos os valores preenchidos com padding antecipadamente, podemos ter certeza de que o documento não mudará de tamanho e, portanto, não será movido.