Ovviamente questa è una vecchia domanda, ma l'ho trovata quando stavo cercando MongoDB per i dati delle serie temporali. Ho pensato che valesse la pena condividere il seguente approccio per allocare in anticipo documenti completi ed eseguire operazioni di aggiornamento, invece di nuove operazioni di inserimento. Nota, questo approccio è stato documentato qui e qui.
Immagina di archiviare dati ogni minuto. Considera la seguente struttura del 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
}
Questo è paragonabile a un approccio relazionale standard. In questo caso si produce un documento per ogni valore registrato, il che provoca molte operazioni di inserimento. Possiamo fare di meglio. Considera quanto segue:
{
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
}
}
Ora possiamo scrivere un documento ed eseguire 59 aggiornamenti. Questo è molto meglio perché gli aggiornamenti sono atomici, le singole scritture sono più piccole e ci sono altri vantaggi in termini di prestazioni e concorrenza. Ma cosa accadrebbe se volessimo archiviare l'intera giornata, e non solo le intere ore, in un unico documento. Ciò richiederebbe quindi di percorrere 1440 voci per ottenere l'ultimo valore. Per migliorare su questo, possiamo estendere ulteriormente a quanto segue:
{
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 questo approccio nidificato, ora dobbiamo solo camminare, al massimo, 24 + 60 per ottenere l'ultimo valore della giornata.
Se costruiamo i documenti con tutti i valori riempiti in anticipo, possiamo essere sicuri che il documento non cambierà dimensione e quindi non verrà spostato.