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
}
]
}