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.