Oczywiście jest to stare pytanie, ale natknąłem się na nie, gdy szukałem danych MongoDB pod kątem danych z serii czasowych. Pomyślałem, że warto podzielić się następującym podejściem do wcześniejszego przydzielania kompletnych dokumentów i wykonywania operacji aktualizacji, w przeciwieństwie do nowych operacji wstawiania. Zauważ, że to podejście zostało udokumentowane tutaj i tutaj.
Wyobraź sobie, że przechowujesz dane co minutę. Rozważ następującą strukturę dokumentu:
{
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
}
Jest to porównywalne ze standardowym podejściem relacyjnym. W takim przypadku tworzony jest jeden dokument na zarejestrowaną wartość, co powoduje wiele operacji wstawiania. Możemy zrobić lepiej. Rozważ następujące kwestie:
{
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
}
}
Teraz możemy napisać jeden dokument i wykonać 59 aktualizacji. Jest to znacznie lepsze, ponieważ aktualizacje są niepodzielne, pojedyncze zapisy są mniejsze i istnieją inne korzyści związane z wydajnością i współbieżnością. Ale co by było, gdybyśmy chcieli przechowywać cały dzień, a nie tylko godziny w jednym dokumencie. Wymagałoby to od nas przejścia przez 1440 wpisów, aby uzyskać ostatnią wartość. Aby to poprawić, możemy rozszerzyć do następujących czynności:
{
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}
}
}
Korzystając z tego zagnieżdżonego podejścia, musimy teraz przejść maksymalnie 24 + 60, aby uzyskać ostatnią wartość w ciągu dnia.
Jeśli zbudujemy dokumenty ze wszystkimi wartościami uzupełnionymi z dopiskiem, możemy być pewni, że dokument nie zmieni rozmiaru, a tym samym nie zostanie przesunięty.