Aby to zrobić, potrzebujesz ram agregacji, myślę, że naprawdę powinieneś zmienić strukturę, ale pracując z tym, co masz:
Model.aggregate(
[
{ "$match": { "prices.100": { "$exists": true } }},
{ "$unwind": "$prices.100" },
{ "$group": {
"_id": "$_id",
"price": { "$last": "$prices.100" }
}},
{ "$project": { "_id": 0, "prices.100": "$price" } }
]
)
W przyszłych wydaniach będziesz mógł po prostu używać nowego $slice
operator:
Model.aggregate(
[
{ "$match": { "prices.100": { "$exists": true } } },
{ "$project": {
"_id": 0,
"prices.100": { "$slice": ["$prices.100",-1] }
}}
]
)
W rzeczywistości możesz wykonać „oba” pola jednocześnie:
Model.aggregate(
[
{ "$match": { "prices.100": { "$exists": true } } },
{ "$project": {
"_id": 0,
"prices.100": { "$slice": ["$prices.100",-1] },
"prices.101": { "$slice": ["$prices.100",-1] }
}}
]
)
A to o wiele lepsze niż przetwarzanie za pomocą $unwind
i $last
aby pobrać ostatni element tablicy, gdy $group
jest stosowany w celu odzyskania danych.
Zasadniczo ma taką samą wydajność jak zwykłe zapytanie w nowszej formie. W obecnej formie będzie wolniej.