sql >> Database teknologi >  >> NoSQL >> MongoDB

Hvordan får man den nye værdi tilbage efter en opdatering i et indlejret array?

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



  1. Spring boot starter data hvile, @Notnull begrænsning virker ikke

  2. Meteor uden mongo

  3. Hvorfor har vi brug for en 'arbiter' i MongoDB-replikering?

  4. Høj tilgængelighed med Redis Sentinels:Tilslutning til Redis Master/Slave Sets