Du behöver aggregeringsramverket för att göra detta, jag tycker att du verkligen borde ändra strukturen, men arbeta 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 framtida utgåvor kommer du bara att kunna använda den nya $slice
operatör:
Model.aggregate(
[
{ "$match": { "prices.100": { "$exists": true } } },
{ "$project": {
"_id": 0,
"prices.100": { "$slice": ["$prices.100",-1] }
}}
]
)
Du kan faktiskt göra "båda" fälten samtidigt:
Model.aggregate(
[
{ "$match": { "prices.100": { "$exists": true } } },
{ "$project": {
"_id": 0,
"prices.100": { "$slice": ["$prices.100",-1] },
"prices.101": { "$slice": ["$prices.100",-1] }
}}
]
)
Och det är mycket bättre än att bearbeta med $unwind
och $last
för att få det sista elementet i arrayen när $group
används för att få tillbaka data.
Den har i princip samma prestanda som en vanlig fråga i den nyare formen. I den nuvarande formen kommer det att gå långsammare.