Du har brug for aggregeringsrammen for at gøre dette, jeg synes virkelig, du burde ændre strukturen, men at arbejde med det, du har:
Model.aggregate(
[
{ "$match": { "prices.100": { "$exists": true } }},
{ "$unwind": "$prices.100" },
{ "$group": {
"_id": "$_id",
"price": { "$last": "$prices.100" }
}},
{ "$project": { "_id": 0, "prices.100": "$price" } }
]
)
I fremtidige udgivelser vil du kun kunne bruge den nye $slice
operatør:
Model.aggregate(
[
{ "$match": { "prices.100": { "$exists": true } } },
{ "$project": {
"_id": 0,
"prices.100": { "$slice": ["$prices.100",-1] }
}}
]
)
Faktisk kan du lave "begge" felter på samme tid:
Model.aggregate(
[
{ "$match": { "prices.100": { "$exists": true } } },
{ "$project": {
"_id": 0,
"prices.100": { "$slice": ["$prices.100",-1] },
"prices.101": { "$slice": ["$prices.100",-1] }
}}
]
)
Og det er meget bedre end at behandle med $unwind
og $last
for at få det sidste element i arrayet, når $group
anvendes for at få dataene tilbage.
Det har grundlæggende den samme ydeevne som en almindelig forespørgsel i den nyere form. I den nuværende form vil det gå langsommere.