Dazu benötigen Sie das Aggregations-Framework. Ich denke, Sie sollten die Struktur wirklich ändern, aber mit dem arbeiten, was Sie haben:
Model.aggregate(
[
{ "$match": { "prices.100": { "$exists": true } }},
{ "$unwind": "$prices.100" },
{ "$group": {
"_id": "$_id",
"price": { "$last": "$prices.100" }
}},
{ "$project": { "_id": 0, "prices.100": "$price" } }
]
)
In zukünftigen Versionen können Sie einfach das neue $slice
verwenden Betreiber:
Model.aggregate(
[
{ "$match": { "prices.100": { "$exists": true } } },
{ "$project": {
"_id": 0,
"prices.100": { "$slice": ["$prices.100",-1] }
}}
]
)
Tatsächlich können Sie "beide" Felder gleichzeitig bearbeiten:
Model.aggregate(
[
{ "$match": { "prices.100": { "$exists": true } } },
{ "$project": {
"_id": 0,
"prices.100": { "$slice": ["$prices.100",-1] },
"prices.101": { "$slice": ["$prices.100",-1] }
}}
]
)
Und das ist viel besser als die Verarbeitung mit $unwind
und $last
um das letzte Element des Arrays abzurufen, wenn $group
wird angewendet, um die Daten zurückzubekommen.
Es hat im Grunde die gleiche Leistung wie eine reguläre Abfrage in der neueren Form. In der jetzigen Form wird es langsamer sein.