Vous avez besoin du cadre d'agrégation pour ce faire, je pense que vous devriez vraiment changer la structure, mais en travaillant avec ce que vous avez :
Model.aggregate(
[
{ "$match": { "prices.100": { "$exists": true } }},
{ "$unwind": "$prices.100" },
{ "$group": {
"_id": "$_id",
"price": { "$last": "$prices.100" }
}},
{ "$project": { "_id": 0, "prices.100": "$price" } }
]
)
Dans les prochaines versions, vous pourrez simplement utiliser le nouveau $slice
opérateur :
Model.aggregate(
[
{ "$match": { "prices.100": { "$exists": true } } },
{ "$project": {
"_id": 0,
"prices.100": { "$slice": ["$prices.100",-1] }
}}
]
)
En fait vous pouvez faire "les deux" champs en même temps :
Model.aggregate(
[
{ "$match": { "prices.100": { "$exists": true } } },
{ "$project": {
"_id": 0,
"prices.100": { "$slice": ["$prices.100",-1] },
"prices.101": { "$slice": ["$prices.100",-1] }
}}
]
)
Et c'est bien mieux que de traiter avec $unwind
et $last
pour obtenir le dernier élément du tableau lorsque $group
est appliqué pour récupérer les données.
Il a essentiellement les mêmes performances qu'une requête régulière dans le nouveau formulaire. Sous la forme actuelle, cela va être plus lent.