Necesita el marco de agregación para hacer esto, creo que realmente debería cambiar la estructura, pero trabajando con lo que tiene:
Model.aggregate(
[
{ "$match": { "prices.100": { "$exists": true } }},
{ "$unwind": "$prices.100" },
{ "$group": {
"_id": "$_id",
"price": { "$last": "$prices.100" }
}},
{ "$project": { "_id": 0, "prices.100": "$price" } }
]
)
En versiones futuras, solo podrá usar el nuevo $slice
operador:
Model.aggregate(
[
{ "$match": { "prices.100": { "$exists": true } } },
{ "$project": {
"_id": 0,
"prices.100": { "$slice": ["$prices.100",-1] }
}}
]
)
De hecho, puede hacer "ambos" campos al mismo tiempo:
Model.aggregate(
[
{ "$match": { "prices.100": { "$exists": true } } },
{ "$project": {
"_id": 0,
"prices.100": { "$slice": ["$prices.100",-1] },
"prices.101": { "$slice": ["$prices.100",-1] }
}}
]
)
Y eso es mucho mejor que procesar con $unwind
y $last
para obtener el último elemento de la matriz cuando $group
se aplica para recuperar los datos.
Básicamente tiene el mismo rendimiento que una consulta regular en la forma más nueva. En la forma actual, será más lento.