Имате нужда от рамка за агрегиране, за да направите това, мисля, че наистина трябва да промените структурата, но работейки с това, което имате:
Model.aggregate(
[
{ "$match": { "prices.100": { "$exists": true } }},
{ "$unwind": "$prices.100" },
{ "$group": {
"_id": "$_id",
"price": { "$last": "$prices.100" }
}},
{ "$project": { "_id": 0, "prices.100": "$price" } }
]
)
В бъдещите версии ще можете да използвате само новия $slice
оператор:
Model.aggregate(
[
{ "$match": { "prices.100": { "$exists": true } } },
{ "$project": {
"_id": 0,
"prices.100": { "$slice": ["$prices.100",-1] }
}}
]
)
Всъщност можете да направите „и двете“ полета едновременно:
Model.aggregate(
[
{ "$match": { "prices.100": { "$exists": true } } },
{ "$project": {
"_id": 0,
"prices.100": { "$slice": ["$prices.100",-1] },
"prices.101": { "$slice": ["$prices.100",-1] }
}}
]
)
И това е много по-добре от обработката с $unwind
и $last
за да получите последния елемент от масива, когато $group
се прилага за връщане на данните.
По принцип има същата производителност като обикновена заявка в по-новата форма. В настоящата форма ще бъде по-бавно.