Používam MongoDB na ukladanie údajov časových radov s medzerami. Každý dokument patrí k jednej položke a obsahuje zmeny pre niekoľko meracích bodov. Každý merací bod má ID, použil som nasledujúcu schému id some-id-XXX
v nižšie uvedenom príklade.
Aplikácia zapisuje iba zmeny do súborukonkrétny čiastkový dokument. Z tohto dôvodu existuje možnosť medzier v sérii, keď APP načíta celý dokument, skontroluje, či neobsahuje zmeny, a aktualizuje čiastkové dokumenty ("some-id-1"
napríklad), ktorý má zmeny.
{
"_id": "XXX-DAY_OF_YEAR",
"date": null /* A date used for the TTL index */,
"series" : {
"some-id-1" : [
{
"ts" : 1457959837,
"value" : 385,
"meta" : "some meta info …"
},
{
"ts" : 1457959837,
"value" : 385,
"meta" : "some meta info …"
},
{
"ts" : 1458286255,
"value" : 380,
"meta" : "some meta info …"
},
{
"ts" : 1458346606,
"value" : 375,
"meta" : "some meta info …"
},
{
"ts" : 1458381111,
"value" : 368,
"meta" : "some meta info …"
},
{
"ts" : 1458381461,
"value" : 365,
"meta" : "some meta info …"
},
{
"ts" : 1458606338,
"value" : 385,
"meta" : "some meta info …"
},
{
"ts" : 1458606338,
"expired": true
}
],
"some-id-2" : [
{
"ts" : 1439802083,
"value" : 430,
"meta" : "some meta info …"
}
],
"some-id-42" : [
{
"ts" : 1457545167,
"value" : 518,
"meta" : "some meta info …"
},
{
"ts" : 1458483441,
"value" : 1034,
"meta" : "some meta info …"
},
{
"ts" : 1458518979,
"value" : 518,
"meta" : "some meta info …"
}
],
"some-id-1337" : [
{
"ts" : 1458017854,
"value" : 361,
"meta" : "some meta info …"
},
{
"ts" : 1458050773,
"value" : 384,
"meta" : "some meta info …"
},
{
"ts" : 1458115173,
"value" : 383,
"meta" : "some meta info …"
},
{
"ts" : 1458143968,
"value" : 382,
"meta" : "some meta info …"
},
{
"ts" : 1458176011,
"value" : 381,
"meta" : "some meta info …"
},
{
"ts" : 1458212600,
"value" : 384,
"meta" : "some meta info …"
},
{
"ts" : 1458245285,
"value" : 383,
"meta" : "some meta info …"
},
{
"ts" : 1458277108,
"value" : 382,
"meta" : "some meta info …"
},
{
"ts" : 1458309875,
"value" : 379,
"meta" : "some meta info …"
},
{
"ts" : 1458338258,
"value" : 378,
"meta" : "some meta info …"
},
{
"ts" : 1458374471,
"value" : 374,
"meta" : "some meta info …"
},
{
"ts" : 1458405856,
"value" : 364,
"meta" : "some meta info …"
},
{
"ts" : 1458435330,
"value" : 363,
"meta" : "some meta info …"
},
{
"ts" : 1458471185,
"value" : 362,
"meta" : "some meta info …"
},
{
"ts" : 1458500103,
"value" : 361,
"meta" : "some meta info …"
},
{
"ts" : 1458535837,
"value" : 360,
"meta" : "some meta info …"
},
{
"ts" : 1458568805,
"value" : 364,
"meta" : "some meta info …"
},
{
"ts" : 1458633188,
"value" : 384,
"meta" : "some meta info …"
}
]
}
}
Problémom tohto prístupu je prenos generovaný načítaním celého dokumentu, ktorý je potrebný na kontrolu zmien alebo medzier.
Ak by som bol schopný načítať iba najnovšiu hodnotu (poslednú hodnotu v poli), prevádzka by sa znížila.
{
"series" : {
"some-id-1" : [
{
"ts" : 1458606338,
"expired": true
}
],
"some-id-2" : [
{
"ts" : 1439802083,
"value" : 430,
"meta" : "some meta info …"
}
],
"some-id-42" : [
{
"ts" : 1458518979,
"value" : 518,
"meta" : "some meta info …"
}
],
"some-id-1337" : [
{
"ts" : 1458633188,
"value" : 384,
"meta" : "some meta info …"
}
]
}
}
Pokiaľ viem ID, môžem použiť projekciu na získanie posledného posledného záznamu.
db.Series.find(
{ "series.some-id-42" : { $exists: true } },
{ "series.some-id-42.$": -1}
)
Ale keďže zmena môže obsahovať medzery, nepoznám všetky identifikátory vyskytujúce sa v dokumente cieľovej série.
Existuje nejaká možnosť archivovať to pomocou agregačného rámca alebo s nejakou šikovnou projekciou?
Moja jediná myšlienka je uložiť posledné hodnoty iba v kompaktnejšej podobe a iba do projektu {last_recent: 1}
:
{
"recent": {
"some-id-1" : 0,
"some-id-2" : 430,
"some-id-42" : 518,
"some-id-1337" : 384
}
"series" : { /* … */ }
}
Ale dúfam, že pre tento problém existuje elegantnejšie riešenie.
odpovede:
0 pre odpoveď č. 1Hlavným problémom je, že ukladáte údaje do názvov polí, čo sú ID.
Schéma by mala byť pravdepodobne:
{
"series": [
{
"id": 1,
"content": [
{
"ts": 1458606338,
"expired": true
}
]
},
{
"id": 2,
"content": [
{
"ts": 1439802083,
"value": 430,
"meta": "some meta info …"
}
]
},
{
"id": 42,
"content": [
{
"ts": 1458518979,
"value": 518,
"meta": "some meta info …"
}
]
},
{
"id": 1337,
"content": [
{
"ts": 1458633188,
"value": 384,
"meta": "some meta info …"
}
]
}
]
}