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