Если вы используете MongoDB 3.0 или новее, вам нужно использовать .findOneAndUpdate()
и использовать параметр projection
, чтобы указать подмножество полей для возврата. Вам также нужно установить returnNewDocument
на true
. Конечно, вам необходимо использовать оператор проекции $elemMatch
, потому что вы не можете использовать позиционную проекцию и вернуть новый документ.
Как кто-то указал:
Вы должны использовать .findOneAndUpdate()
, потому что .findAndModify()
выделяется как устаревший в каждом официальном языковом драйвере. Другое дело, что синтаксис и параметры довольно одинаковы для всех драйверов для .findOneAndUpdate()
. С .findAndModify()
большинство драйверов не используют один и тот же объект с ключами «query / update / fields». Так что это немного менее запутанно, когда кто-то обращается к другому языку, чтобы быть последовательным. Стандартизированные изменения 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
}
]
}