MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Selecione o último valor da matriz no subdocumento


Você precisa do framework de agregação para fazer isso, acho que realmente deveria mudar a estrutura, mas trabalhando com o que você tem:
Model.aggregate(
    [
       { "$match": { "prices.100": { "$exists": true } }},
       { "$unwind": "$prices.100" },
       { "$group": {
          "_id": "$_id",
          "price": { "$last": "$prices.100" }
       }},
       { "$project": { "_id": 0, "prices.100": "$price" } }
     ]
) 

Em versões futuras, você poderá usar apenas o novo $slice operador:
Model.aggregate(
    [
        { "$match": { "prices.100": { "$exists": true } } },
        { "$project": {
            "_id": 0,
            "prices.100": { "$slice": ["$prices.100",-1] }
        }}
    ]
)

Na verdade, você pode fazer "ambos" campos ao mesmo tempo:
Model.aggregate(
    [
        { "$match": { "prices.100": { "$exists": true } } },
        { "$project": {
            "_id": 0,
            "prices.100": { "$slice": ["$prices.100",-1] },
            "prices.101": { "$slice": ["$prices.100",-1] }
        }}
    ]
)

E isso é muito melhor do que processar com $unwind e $last para obter o último elemento da matriz quando $group é aplicado para obter os dados de volta.

Basicamente, tem o mesmo desempenho de uma consulta regular na forma mais recente. Na forma atual, será mais lento.