K tomu potřebujete agregační rámec, myslím, že byste opravdu měli změnit strukturu, ale pracujte s tím, co máte:
Model.aggregate(
[
{ "$match": { "prices.100": { "$exists": true } }},
{ "$unwind": "$prices.100" },
{ "$group": {
"_id": "$_id",
"price": { "$last": "$prices.100" }
}},
{ "$project": { "_id": 0, "prices.100": "$price" } }
]
)
V budoucích verzích budete moci používat pouze nový $slice
operátor:
Model.aggregate(
[
{ "$match": { "prices.100": { "$exists": true } } },
{ "$project": {
"_id": 0,
"prices.100": { "$slice": ["$prices.100",-1] }
}}
]
)
Ve skutečnosti můžete dělat „obě“ pole současně:
Model.aggregate(
[
{ "$match": { "prices.100": { "$exists": true } } },
{ "$project": {
"_id": 0,
"prices.100": { "$slice": ["$prices.100",-1] },
"prices.101": { "$slice": ["$prices.100",-1] }
}}
]
)
A to je mnohem lepší než zpracování pomocí $unwind
a $last
získat poslední prvek pole, když $group
se použije k získání dat zpět.
V zásadě má stejný výkon jako běžný dotaz v novější podobě. V současné podobě to bude pomalejší.