Pokud používáte MongoDB 3.0 nebo novější, musíte použít .findOneAndUpdate() a použijte projection možnost určit podmnožinu polí, která se mají vrátit. Musíte také nastavit returnNewDocument true . Samozřejmě musíte použít $elemMatch promítací operátor zde, protože nemůžete použít poziční projekci a vrátit nový dokument.
Jak někdo poznamenal:
Měli byste používat
.findOneAndUpdate()protože.findAndModify()je v každém oficiálním jazykovém ovladači označen jako zastaralý. Další věc je, že syntaxe a možnosti jsou docela konzistentní napříč ovladači pro.findOneAndUpdate(). Pomocí.findAndModify(), většina ovladačů nepoužívá stejný jediný objekt s klávesami „query/update/fields“. Je tedy o něco méně matoucí, když se někdo přihlásí do jiného jazyka, aby byl konzistentní. Standardizované změny API pro.findOneAndUpdate()ve skutečnosti odpovídají vydání serveru 3.x spíše než 3.2.x. Úplný rozdíl spočívá v tom, že metody shellu ve skutečnosti zaostávaly za ostatními ovladači (pro jednou!) při implementaci metody. Takže většina ovladačů ve skutečnosti zaznamenala velký nárůst vydání odpovídající vydání 3.x s takovými změnami.
db.collection.findOneAndUpdate(
{
"_id": ObjectId("56d6a7292c06e85687f44541"),
"rankings._id" : ObjectId("46d6a7292c06e85687f55543")
},
{ $inc : { "rankings.$.score" : 1 } },
{
"projection": {
"rankings": {
"$elemMatch": { "_id" : ObjectId("46d6a7292c06e85687f55543") }
}
},
"returnNewDocument": true
}
)
Od MongoDB 3.0 výše musíte použít findAndModify a fields možnosti také musíte nastavit new true v jiném vrátíte novou hodnotu.
db.collection.findAndModify({
query: {
"_id": ObjectId("56d6a7292c06e85687f44541"),
"rankings._id" : ObjectId("46d6a7292c06e85687f55543")
},
update: { $inc : { "rankings.$.score" : 1 } },
new: true,
fields: {
"rankings": {
"$elemMatch": { "_id" : ObjectId("46d6a7292c06e85687f55543") }
}
}
})
Oba dotazy vynesou:
{
"_id" : ObjectId("56d6a7292c06e85687f44541"),
"rankings" : [
{
"_id" : ObjectId("46d6a7292c06e85687f55543"),
"name" : "Ranking 2",
"score" : 11
}
]
}