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

Come recuperare il nuovo valore dopo un aggiornamento in un array incorporato?

Se utilizzi MongoDB 3.0 o versioni successive, devi utilizzare .findOneAndUpdate() e usa projection opzione per specificare il sottoinsieme di campi da restituire. Devi anche impostare returnNewDocument su true . Ovviamente devi usare $elemMatch operatore di proiezione qui perché non è possibile utilizzare una proiezione posizionale e restituire il nuovo documento.

Come qualcuno ha sottolineato:

Dovresti usare .findOneAndUpdate() perché .findAndModify() è evidenziato come deprecato in ogni driver di lingua ufficiale. L'altra cosa è che la sintassi e le opzioni sono abbastanza coerenti tra i driver per .findOneAndUpdate() . Con .findAndModify() , la maggior parte dei driver non utilizza lo stesso singolo oggetto con le chiavi "query/update/fields". Quindi è un po' meno confuso quando qualcuno si rivolge a un'altra lingua per essere coerente. Modifiche API standardizzate per .findOneAndUpdate() corrispondono effettivamente alla versione del server 3.x anziché 3.2.x. La completa distinzione è che i metodi della shell sono rimasti indietro rispetto agli altri driver (per una volta!) nell'implementazione del metodo. Quindi la maggior parte dei driver ha effettivamente avuto un aumento importante del rilascio corrispondente alla versione 3.x con tali modifiche.

db.collection.findOneAndUpdate( 
    { 
        "_id": ObjectId("56d6a7292c06e85687f44541"), 
         "rankings._id" : ObjectId("46d6a7292c06e85687f55543") 
    },  
    { $inc : { "rankings.$.score" : 1 } },  
    { 
        "projection": { 
            "rankings": { 
                "$elemMatch": { "_id" : ObjectId("46d6a7292c06e85687f55543") } 
            }
        }, 
        "returnNewDocument": true 
    }
)

Da MongoDB 3.0 in poi, devi usare findAndModify e i fields opzioni inoltre devi impostare new su true in altri per restituire il nuovo valore.

db.collection.findAndModify({   
    query: { 
        "_id": ObjectId("56d6a7292c06e85687f44541"), 
        "rankings._id" : ObjectId("46d6a7292c06e85687f55543") 
    },     
    update: { $inc : { "rankings.$.score" : 1 } },       
    new: true,  
    fields: { 
        "rankings": { 
            "$elemMatch": { "_id" : ObjectId("46d6a7292c06e85687f55543") }
        }  
    }
})

Entrambe le query producono:

{
        "_id" : ObjectId("56d6a7292c06e85687f44541"),
        "rankings" : [
                {
                        "_id" : ObjectId("46d6a7292c06e85687f55543"),
                        "name" : "Ranking 2",
                        "score" : 11
                }
        ]
}