sql >> Base de Datos >  >> NoSQL >> MongoDB

Seleccione el último valor de la matriz en el subdocumento

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.