Hai bisogno del framework di aggregazione per farlo, penso che dovresti davvero cambiare la struttura, ma lavorando con quello che hai:
Model.aggregate(
[
{ "$match": { "prices.100": { "$exists": true } }},
{ "$unwind": "$prices.100" },
{ "$group": {
"_id": "$_id",
"price": { "$last": "$prices.100" }
}},
{ "$project": { "_id": 0, "prices.100": "$price" } }
]
)
Nelle versioni future potrai semplicemente usare il nuovo $slice
operatore:
Model.aggregate(
[
{ "$match": { "prices.100": { "$exists": true } } },
{ "$project": {
"_id": 0,
"prices.100": { "$slice": ["$prices.100",-1] }
}}
]
)
Infatti puoi fare "entrambi" i campi contemporaneamente:
Model.aggregate(
[
{ "$match": { "prices.100": { "$exists": true } } },
{ "$project": {
"_id": 0,
"prices.100": { "$slice": ["$prices.100",-1] },
"prices.101": { "$slice": ["$prices.100",-1] }
}}
]
)
Ed è molto meglio che elaborare con $unwind
e $last
per ottenere l'ultimo elemento dell'array quando $group
viene applicato per recuperare i dati.
Fondamentalmente ha le stesse prestazioni di una normale query nella forma più recente. Nella forma attuale, sarà più lento.