sql >> Base de Datos >  >> NoSQL >> MongoDB

¿Cómo recuperar el nuevo valor después de una actualización en una matriz incrustada?

Si está en MongoDB 3.0 o posterior, debe usar .findOneAndUpdate() y usa projection opción para especificar el subconjunto de campos a devolver. También debe configurar returnNewDocument a true . Por supuesto que necesitas usar el $elemMatch operador de proyección aquí porque no puede usar una proyección posicional y devolver el nuevo documento.

Como alguien señaló:

Deberías usar .findOneAndUpdate() porque .findAndModify() se destaca como obsoleto en cada controlador de idioma oficial. La otra cosa es que la sintaxis y las opciones son bastante consistentes entre los controladores para .findOneAndUpdate() . Con .findAndModify() , la mayoría de los controladores no usan el mismo objeto único con las teclas "consulta/actualización/campos". Así que es un poco menos confuso cuando alguien se aplica a otro idioma para ser consistente. Cambios API estandarizados para .findOneAndUpdate() en realidad corresponden a la versión del servidor 3.x en lugar de 3.2.x. La distinción completa es que los métodos de shell en realidad se quedaron atrás de los otros controladores (¡por una vez!) en la implementación del método. Por lo tanto, la mayoría de los controladores en realidad tuvieron un lanzamiento importante correspondiente al lanzamiento 3.x con dichos cambios.

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

Desde MongoDB 3.0 en adelante, debe usar findAndModify y los fields opciones también necesita establecer new a true en otro para devolver el nuevo valor.

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

Ambas consultas producen:

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