Je hebt het aggregatieraamwerk nodig om dit te doen, ik denk dat je de structuur echt moet veranderen, maar werken met wat je hebt:
Model.aggregate(
[
{ "$match": { "prices.100": { "$exists": true } }},
{ "$unwind": "$prices.100" },
{ "$group": {
"_id": "$_id",
"price": { "$last": "$prices.100" }
}},
{ "$project": { "_id": 0, "prices.100": "$price" } }
]
)
In toekomstige releases kun je gewoon de nieuwe $slice
. gebruiken operator:
Model.aggregate(
[
{ "$match": { "prices.100": { "$exists": true } } },
{ "$project": {
"_id": 0,
"prices.100": { "$slice": ["$prices.100",-1] }
}}
]
)
In feite kunt u "beide" velden tegelijkertijd doen:
Model.aggregate(
[
{ "$match": { "prices.100": { "$exists": true } } },
{ "$project": {
"_id": 0,
"prices.100": { "$slice": ["$prices.100",-1] },
"prices.101": { "$slice": ["$prices.100",-1] }
}}
]
)
En dat is een stuk beter dan verwerken met $unwind
en $last
om het laatste element van de array te krijgen wanneer $group
wordt toegepast om de gegevens terug te krijgen.
Het heeft in principe dezelfde prestaties als een gewone zoekopdracht in de nieuwere vorm. In de huidige vorm zal het langzamer zijn.