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