Você precisa do framework de agregação para fazer isso, acho que realmente deveria mudar a estrutura, mas trabalhando com o que você tem:
Model.aggregate(
[
{ "$match": { "prices.100": { "$exists": true } }},
{ "$unwind": "$prices.100" },
{ "$group": {
"_id": "$_id",
"price": { "$last": "$prices.100" }
}},
{ "$project": { "_id": 0, "prices.100": "$price" } }
]
)
Em versões futuras, você poderá usar apenas o novo
$slice
operador:Model.aggregate(
[
{ "$match": { "prices.100": { "$exists": true } } },
{ "$project": {
"_id": 0,
"prices.100": { "$slice": ["$prices.100",-1] }
}}
]
)
Na verdade, você pode fazer "ambos" campos ao mesmo tempo:
Model.aggregate(
[
{ "$match": { "prices.100": { "$exists": true } } },
{ "$project": {
"_id": 0,
"prices.100": { "$slice": ["$prices.100",-1] },
"prices.101": { "$slice": ["$prices.100",-1] }
}}
]
)
E isso é muito melhor do que processar com
$unwind
e $last
para obter o último elemento da matriz quando $group
é aplicado para obter os dados de volta. Basicamente, tem o mesmo desempenho de uma consulta regular na forma mais recente. Na forma atual, será mais lento.