Очевидно това е стар въпрос, но попаднах на него, когато проучвах MongoDB за данни от времеви серии. Мислех, че може да си струва да споделя следния подход за предварително разпределяне на пълни документи и извършване на операции за актуализиране, за разлика от новите операции за вмъкване. Имайте предвид, че този подход е документиран тук и тук.
Представете си, че съхранявате данни всяка минута. Помислете за следната структура на документа:
{
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
}
Това е сравнимо със стандартен релационен подход. В този случай създавате един документ на записана стойност, което причинява много операции за вмъкване. Можем по-добре. Помислете за следното:
{
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
}
}
Сега можем да напишем един документ и да извършим 59 актуализации. Това е много по-добре, защото актуализациите са атомарни, отделните записи са по-малки и има други предимства за производителност и едновременност. Но какво ще стане, ако искаме да съхраняваме целия ден, а не само целите часове, в един документ. Това ще изисква от нас да преминем покрай 1440 записа, за да получим последната стойност. За да подобрим това, можем да разширим допълнително до следното:
{
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}
}
}
Използвайки този вложен подход, сега трябва само да вървим, максимум, 24 + 60, за да получим последната стойност за деня.
Ако изградим документите с всички стойности, попълнени с допълване предварително, можем да сме сигурни, че документът няма да промени размера и следователно няма да бъде преместен.