Jeśli korzystasz z MongoDB 3.0 lub nowszego, musisz użyć .findOneAndUpdate()
i użyj projection
możliwość określenia podzbioru pól do zwrócenia. Musisz także ustawić returnNewDocument
na true
. Oczywiście musisz użyć $elemMatch
operator projekcji tutaj, ponieważ nie możesz użyć projekcji pozycyjnej i zwrócić nowego dokumentu.
Jak ktoś zauważył:
Powinieneś używać .findOneAndUpdate()
ponieważ .findAndModify()
jest wyróżniony jako przestarzały w każdym oficjalnym języku sterownika. Inną rzeczą jest to, że składnia i opcje są dość spójne we wszystkich sterownikach dla .findOneAndUpdate()
. Z .findAndModify()
, większość sterowników nie używa tego samego pojedynczego obiektu z kluczami "zapytanie/aktualizacja/pola". Więc jest trochę mniej zagmatwane, gdy ktoś stosuje się do innego języka, aby zachować spójność. Zmiany w ustandaryzowanym interfejsie API dla .findOneAndUpdate()
faktycznie odpowiadają wersji serwera 3.x, a nie 3.2.x. Całkowite rozróżnienie polega na tym, że metody powłoki faktycznie pozostają w tyle za innymi sterownikami ( raz ! ) w implementacji metody. Tak więc większość sterowników faktycznie miała poważny wzrost wydania odpowiadający wydaniu 3.x z takimi zmianami.
db.collection.findOneAndUpdate(
{
"_id": ObjectId("56d6a7292c06e85687f44541"),
"rankings._id" : ObjectId("46d6a7292c06e85687f55543")
},
{ $inc : { "rankings.$.score" : 1 } },
{
"projection": {
"rankings": {
"$elemMatch": { "_id" : ObjectId("46d6a7292c06e85687f55543") }
}
},
"returnNewDocument": true
}
)
Począwszy od MongoDB 3.0, musisz użyć findAndModify
i fields
opcje również musisz ustawić new
na true
w innym, aby zwrócić nową wartość.
db.collection.findAndModify({
query: {
"_id": ObjectId("56d6a7292c06e85687f44541"),
"rankings._id" : ObjectId("46d6a7292c06e85687f55543")
},
update: { $inc : { "rankings.$.score" : 1 } },
new: true,
fields: {
"rankings": {
"$elemMatch": { "_id" : ObjectId("46d6a7292c06e85687f55543") }
}
}
})
Wyniki obu zapytań:
{
"_id" : ObjectId("56d6a7292c06e85687f44541"),
"rankings" : [
{
"_id" : ObjectId("46d6a7292c06e85687f55543"),
"name" : "Ranking 2",
"score" : 11
}
]
}