Hvis du er på MongoDB 3.0 eller nyere, skal du bruge .findOneAndUpdate()
og brug projection
mulighed for at angive det undersæt af felter, der skal returneres. Du skal også indstille returnNewDocument
til true
. Selvfølgelig skal du bruge $elemMatch
projektionsoperator her, fordi du ikke kan bruge en positionsprojektion og returnere det nye dokument.
Som nogen påpegede:
Du bør bruge .findOneAndUpdate()
fordi .findAndModify()
er højhed som forældet i enhver officiel sprogdriver. Den anden ting er, at syntaksen og mulighederne er ret konsistente på tværs af drivere for .findOneAndUpdate()
. Med .findAndModify()
, bruger de fleste drivere ikke det samme enkelt objekt med "query/update/fields"-taster. Så det er lidt mindre forvirrende, når nogen henvender sig til et andet sprog for at være konsekvent. Standardiserede API-ændringer for .findOneAndUpdate()
svarer faktisk til serverudgivelse 3.x i stedet for 3.2.x. Den fulde skelnen er, at shell-metoderne faktisk haltede bagefter de andre drivere (for en gangs skyld!) i implementeringen af metoden. Så de fleste drivere havde faktisk et stort udgivelsesbump svarende til 3.x-udgivelsen med sådanne ændringer.
db.collection.findOneAndUpdate(
{
"_id": ObjectId("56d6a7292c06e85687f44541"),
"rankings._id" : ObjectId("46d6a7292c06e85687f55543")
},
{ $inc : { "rankings.$.score" : 1 } },
{
"projection": {
"rankings": {
"$elemMatch": { "_id" : ObjectId("46d6a7292c06e85687f55543") }
}
},
"returnNewDocument": true
}
)
Fra MongoDB 3.0 og fremefter skal du bruge findAndModify
og fields
muligheder skal du også indstille new
til true
i andet for at returnere den nye værdi.
db.collection.findAndModify({
query: {
"_id": ObjectId("56d6a7292c06e85687f44541"),
"rankings._id" : ObjectId("46d6a7292c06e85687f55543")
},
update: { $inc : { "rankings.$.score" : 1 } },
new: true,
fields: {
"rankings": {
"$elemMatch": { "_id" : ObjectId("46d6a7292c06e85687f55543") }
}
}
})
Begge forespørgsler giver:
{
"_id" : ObjectId("56d6a7292c06e85687f44541"),
"rankings" : [
{
"_id" : ObjectId("46d6a7292c06e85687f55543"),
"name" : "Ranking 2",
"score" : 11
}
]
}