Om du använder MongoDB 3.0 eller senare måste du använda .findOneAndUpdate()
och använd projection
alternativet för att ange den delmängd av fält som ska returneras. Du måste också ställa in returnNewDocument
till true
. Naturligtvis måste du använda $elemMatch
projektionsoperator här eftersom du inte kan använda en positionsprojektion och returnera det nya dokumentet.
Som någon påpekade:
Du bör använda
.findOneAndUpdate()
eftersom.findAndModify()
är höggradig som avskaffad i alla officiella språkförare. Den andra saken är att syntaxen och alternativen är ganska konsekventa för alla drivrutiner för.findOneAndUpdate()
. Med.findAndModify()
, de flesta drivrutiner använder inte samma enda objekt med "query/update/fields"-nycklar. Så det är lite mindre förvirrande när någon ansöker om ett annat språk för att vara konsekvent. Standardiserade API-ändringar för.findOneAndUpdate()
motsvarar faktiskt serverversion 3.x snarare än 3.2.x. Den fullständiga skillnaden är att skalmetoderna faktiskt släpade efter de andra drivrutinerna (för en gångs skull!) i implementeringen av metoden. Så de flesta drivrutiner hade faktiskt en stor utgivningsbump motsvarande 3.x-utgåvan med sådana ändringar.
db.collection.findOneAndUpdate(
{
"_id": ObjectId("56d6a7292c06e85687f44541"),
"rankings._id" : ObjectId("46d6a7292c06e85687f55543")
},
{ $inc : { "rankings.$.score" : 1 } },
{
"projection": {
"rankings": {
"$elemMatch": { "_id" : ObjectId("46d6a7292c06e85687f55543") }
}
},
"returnNewDocument": true
}
)
Från MongoDB 3.0 och framåt måste du använda findAndModify
och fields
alternativ måste du också ställa in new
till true
i annat för att returnera det nya värdet.
db.collection.findAndModify({
query: {
"_id": ObjectId("56d6a7292c06e85687f44541"),
"rankings._id" : ObjectId("46d6a7292c06e85687f55543")
},
update: { $inc : { "rankings.$.score" : 1 } },
new: true,
fields: {
"rankings": {
"$elemMatch": { "_id" : ObjectId("46d6a7292c06e85687f55543") }
}
}
})
Båda frågorna ger:
{
"_id" : ObjectId("56d6a7292c06e85687f44541"),
"rankings" : [
{
"_id" : ObjectId("46d6a7292c06e85687f55543"),
"name" : "Ranking 2",
"score" : 11
}
]
}