sql >> Databasteknik >  >> NoSQL >> MongoDB

Hur får man tillbaka det nya värdet efter en uppdatering i en inbäddad array?

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



  1. MongoParseError:alternativ useCreateIndex, useFindAndModify stöds inte

  2. Mongodb - aggregering $push om villkorlig

  3. Behåller Redis data?

  4. Redis vs. Memcachad