/ / MongoDB Project / Agregujte, aby ste získali všetky záznamy najnovších polí všetkých čiastkových dokumentov - mongodb, mongodb-dotaz, agregačný rámec

MongoDB Project / Aggregate pre získanie všetkých sub dokumentov najnovšie polia - mongodb, mongodb-query, aggregation-framework

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ď č. 1

Hlavný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 …"
}
]
}
]
}