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

Como recuperar o novo valor após uma atualização em uma matriz incorporada?


Se você estiver no MongoDB 3.0 ou mais recente, precisará usar o .findOneAndUpdate() e use projection opção para especificar o subconjunto de campos a serem retornados. Você também precisa definir returnNewDocument para true . Claro que você precisa usar o $elemMatch operador de projeção aqui porque você não pode usar uma projeção posicional e retornar o novo documento.

Como alguém apontou:

Você deve estar usando .findOneAndUpdate() porque .findAndModify() é destacado como obsoleto em todos os drivers de idioma oficial. A outra coisa é que a sintaxe e as opções são bastante consistentes nos drivers para .findOneAndUpdate() . Com .findAndModify() , a maioria dos drivers não usa o mesmo objeto único com chaves "consulta/atualização/campos". Portanto, é um pouco menos confuso quando alguém se aplica a outro idioma para ser consistente. Alterações padronizadas da API para .findOneAndUpdate() realmente correspondem à versão do servidor 3.x em vez de 3.2.x. A diferença completa é que os métodos do shell na verdade ficaram para trás dos outros drivers ( pela primeira vez! ) na implementação do método. Portanto, a maioria dos drivers realmente teve um grande aumento de versão correspondente à versão 3.x com essas alterações.
db.collection.findOneAndUpdate( 
    { 
        "_id": ObjectId("56d6a7292c06e85687f44541"), 
         "rankings._id" : ObjectId("46d6a7292c06e85687f55543") 
    },  
    { $inc : { "rankings.$.score" : 1 } },  
    { 
        "projection": { 
            "rankings": { 
                "$elemMatch": { "_id" : ObjectId("46d6a7292c06e85687f55543") } 
            }
        }, 
        "returnNewDocument": true 
    }
)

A partir do MongoDB 3.0, você precisa usar findAndModify e os fields opções também você precisa definir new para true em outro para retornar o novo valor.
db.collection.findAndModify({   
    query: { 
        "_id": ObjectId("56d6a7292c06e85687f44541"), 
        "rankings._id" : ObjectId("46d6a7292c06e85687f55543") 
    },     
    update: { $inc : { "rankings.$.score" : 1 } },       
    new: true,  
    fields: { 
        "rankings": { 
            "$elemMatch": { "_id" : ObjectId("46d6a7292c06e85687f55543") }
        }  
    }
})

Ambas as consultas geram:
{
        "_id" : ObjectId("56d6a7292c06e85687f44541"),
        "rankings" : [
                {
                        "_id" : ObjectId("46d6a7292c06e85687f55543"),
                        "name" : "Ranking 2",
                        "score" : 11
                }
        ]
}