Ако използвате MongoDB 3.0 или по-нова, трябва да използвате .findOneAndUpdate()
и използвайте projection
опция за задаване на подмножество от полета, които да се върнат. Трябва също да зададете returnNewDocument
до true
. Разбира се, трябва да използвате $elemMatch
проекционен оператор тук, защото не можете да използвате позиционна проекция и да върнете новия документ.
Както някой посочи:
Трябва да използвате
.findOneAndUpdate()
защото.findAndModify()
е маркиран като отхвърлен във всеки драйвер за официален език. Другото нещо е, че синтаксисът и опциите са доста последователни в драйверите за.findOneAndUpdate()
. С.findAndModify()
, повечето драйвери не използват един и същ обект с клавиши "заявка/актуализация/полета". Така че е малко по-малко объркващо, когато някой кандидатства за друг език, за да бъде последователен. Стандартизирани промени в API за.findOneAndUpdate()
всъщност отговарят на версия на сървъра 3.x, а не на 3.2.x. Пълната разлика е, че методите на обвивката всъщност изоставаха от другите драйвери (за веднъж!) при прилагането на метода. Така че повечето драйвери действително имаха значителна промяна в версията, съответстваща на версията 3.x с такива промени.
db.collection.findOneAndUpdate(
{
"_id": ObjectId("56d6a7292c06e85687f44541"),
"rankings._id" : ObjectId("46d6a7292c06e85687f55543")
},
{ $inc : { "rankings.$.score" : 1 } },
{
"projection": {
"rankings": {
"$elemMatch": { "_id" : ObjectId("46d6a7292c06e85687f55543") }
}
},
"returnNewDocument": true
}
)
От MongoDB 3.0 нататък трябва да използвате findAndModify
и fields
опции също трябва да зададете new
до true
в друго, за да върнете новата стойност.
db.collection.findAndModify({
query: {
"_id": ObjectId("56d6a7292c06e85687f44541"),
"rankings._id" : ObjectId("46d6a7292c06e85687f55543")
},
update: { $inc : { "rankings.$.score" : 1 } },
new: true,
fields: {
"rankings": {
"$elemMatch": { "_id" : ObjectId("46d6a7292c06e85687f55543") }
}
}
})
И двете заявки дават:
{
"_id" : ObjectId("56d6a7292c06e85687f44541"),
"rankings" : [
{
"_id" : ObjectId("46d6a7292c06e85687f55543"),
"name" : "Ranking 2",
"score" : 11
}
]
}