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