Als u MongoDB 3.0 of nieuwer gebruikt, moet u de .findOneAndUpdate()
gebruiken en gebruik projection
optie om de subset van te retourneren velden op te geven. U moet ook returnNewDocument
. instellen naar true
. Natuurlijk moet je de $elemMatch
. gebruiken projectie-operator hier omdat u geen positionele projectie kunt gebruiken en het nieuwe document kunt retourneren.
Zoals iemand opmerkte:
U zou
.findOneAndUpdate()
. moeten gebruiken omdat.findAndModify()
wordt gemarkeerd als verouderd in elke officiële taaldriver. Het andere is dat de syntaxis en opties vrij consistent zijn in alle stuurprogramma's voor.findOneAndUpdate()
. Met.findAndModify()
, gebruiken de meeste stuurprogramma's niet hetzelfde enkele object met "query/update/fields"-sleutels. Het is dus een beetje minder verwarrend wanneer iemand een aanvraag indient voor een andere taal om consistent te zijn. Gestandaardiseerde API-wijzigingen voor.findOneAndUpdate()
komt eigenlijk overeen met serverversie 3.x in plaats van 3.2.x. Het volledige onderscheid is dat de shell-methoden bij het implementeren van de methode feitelijk (voor een keer!) achterbleven op de andere stuurprogramma's. Dus de meeste stuurprogramma's hadden eigenlijk een grote release-bump die overeenkomt met de 3.x-release met dergelijke wijzigingen.
db.collection.findOneAndUpdate(
{
"_id": ObjectId("56d6a7292c06e85687f44541"),
"rankings._id" : ObjectId("46d6a7292c06e85687f55543")
},
{ $inc : { "rankings.$.score" : 1 } },
{
"projection": {
"rankings": {
"$elemMatch": { "_id" : ObjectId("46d6a7292c06e85687f55543") }
}
},
"returnNewDocument": true
}
)
Vanaf MongoDB 3.0 moet u findAndModify
. gebruiken en de fields
opties moet je ook new
instellen naar true
in andere om de nieuwe waarde te retourneren.
db.collection.findAndModify({
query: {
"_id": ObjectId("56d6a7292c06e85687f44541"),
"rankings._id" : ObjectId("46d6a7292c06e85687f55543")
},
update: { $inc : { "rankings.$.score" : 1 } },
new: true,
fields: {
"rankings": {
"$elemMatch": { "_id" : ObjectId("46d6a7292c06e85687f55543") }
}
}
})
Beide zoekopdrachten leveren:
{
"_id" : ObjectId("56d6a7292c06e85687f44541"),
"rankings" : [
{
"_id" : ObjectId("46d6a7292c06e85687f55543"),
"name" : "Ranking 2",
"score" : 11
}
]
}