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