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

Actualización de MongoDB Muchos ()

En MongoDB el db.collection.updateMany() El método actualiza todos los documentos que coinciden con el filtro especificado para una colección.

Ejemplo

Supongamos que tenemos una colección llamada pets que contiene los siguientes documentos:

{ "_id" : 1, "name" : "Wag", "type" : "Dog" }
{ "_id" : 2, "name" : "Bark", "type" : "Dog" }
{ "_id" : 3, "name" : "Meow", "type" : "Cat" }

Podemos ver que dos documentos tienen Dog como su type .

Podemos actualizar ambos documentos a la vez así:

db.pets.updateMany( 
    { type: "Dog" },
    { $set: { type: "Cow" } }
    )

Resultado:

{ "acknowledged" : true, "matchedCount" : 2, "modifiedCount" : 2 }

Esto nos muestra que dos documentos coincidieron y dos se actualizaron.

Podemos consultar la colección:

db.pets.find()

Resultado:

{ "_id" : 1, "name" : "Wag", "type" : "Cow" }
{ "_id" : 2, "name" : "Bark", "type" : "Cow" }
{ "_id" : 3, "name" : "Meow", "type" : "Cat" }

Inserción

db.collection.updateMany() método acepta un upsert argumento que le permite realizar una operación upsert.

Cuando upsert: true , se actualizan los documentos que coinciden con los criterios de filtro, pero si no hay coincidencia, se inserta un nuevo documento.

Empecemos de nuevo con los documentos originales:

{ "_id" : 1, "name" : "Wag", "type" : "Dog" }
{ "_id" : 2, "name" : "Bark", "type" : "Dog" }
{ "_id" : 3, "name" : "Meow", "type" : "Cat" }

Ejemplo:

db.pets.updateMany( 
    { name: "Bubbles" },
    { $set: { type: "Fish" } },
    { upsert: true }
    )

Resultado:

 {
 "acknowledged" : true,
 "matchedCount" : 0,
 "modifiedCount" : 0,
 "upsertedId" : ObjectId("5fe27e1dd991410169410244")
 } 

En este caso, no hubo coincidencias, por lo que se alteró un documento.

Revisemos la colección.

db.pets.find()

Resultado:

 { "_id" : 1, "name" : "Wag", "type" : "Dog" }
 { "_id" : 2, "name" : "Bark", "type" : "Dog" }
 { "_id" : 3, "name" : "Meow", "type" : "Cat" }
 { "_id" : ObjectId("5fe27e1dd991410169410244"), "name" : "Bubbles", "type" : "Fish" } 

Documentos incrustados

También puede usar db.collection.updateMany() para actualizar documentos incrustados.

Supongamos que insertamos los siguientes documentos:

db.pets.insertMany([
    {
        "_id" : 1,
        "name" : "Wag",
        "type" : "Dog",
        "specs" : {
            "height" : 400,
            "weight" : 15,
            "color" : "white"
        }
    },  
    {
        "_id" : 2,
        "name" : "Bark",
        "type" : "Dog",
        "specs" : {
            "height" : 200,
            "weight" : 12,
            "color" : "white"
        }
    }
])

Podemos usar el siguiente código para actualizar el documento incrustado.

db.pets.updateMany({ 
    type: "Dog" 
    }, { 
        $set: { 
            "specs.color": "brown",
            "specs.gooddog": false
        } 
})

Resultado:

{ "acknowledged" : true, "matchedCount" : 2, "modifiedCount" : 2 } 

Entonces podemos ver que ambos documentos fueron actualizados.

Revisemos el documento.

db.pets.find({
    type: "Dog"
    }).pretty()

Resultado:

{
	"_id" : 1,
	"name" : "Wag",
	"type" : "Dog",
	"specs" : {
		"height" : 400,
		"weight" : 15,
		"color" : "brown",
		"gooddog" : false
	}
}
{
	"_id" : 2,
	"name" : "Bark",
	"type" : "Dog",
	"specs" : {
		"height" : 200,
		"weight" : 12,
		"color" : "brown",
		"gooddog" : false
	}
}

Podemos ver que los documentos incrustados se actualizaron según lo especificado.

Arreglos

Usemos db.collection.updateMany() para actualizar una matriz.

Supongamos que tenemos una colección llamada players con los siguientes documentos:

 { "_id" : 1, "scores" : [ 1, 5, 3 ] }
 { "_id" : 2, "scores" : [ 8, 17, 18 ] }
 { "_id" : 3, "scores" : [ 15, 11, 8 ] } 

Actualicemos dos elementos de matriz en todos los documentos.

db.players.updateMany({}, 
{ 
        $set: {
            "scores.0": 20, 
            "scores.1": 26
        } 
})

Resultado:

{ "acknowledged" : true, "matchedCount" : 3, "modifiedCount" : 3 }

Podemos ver que los tres documentos fueron actualizados. Esto se debe a que dejé los criterios de filtro en blanco (utilicé {} para los criterios de filtro).

Y veamos el documento.

db.players.find()

Resultado:

 { "_id" : 1, "scores" : [ 20, 26, 3 ] }
 { "_id" : 2, "scores" : [ 20, 26, 18 ] }
 { "_id" : 3, "scores" : [ 20, 26, 8 ] } 

El parámetro arrayFilters

También puede usar los arrayFilters parámetro y el posicional $ operador para determinar qué elementos de la matriz actualizar.

Por ejemplo, mirando nuestro documento anterior:

 { "_id" : 1, "scores" : [ 20, 26, 3 ] }
 { "_id" : 2, "scores" : [ 20, 26, 18 ] }
 { "_id" : 3, "scores" : [ 20, 26, 8 ] } 

Podríamos ejecutar la siguiente consulta para actualizar solo aquellos elementos de la matriz que tengan un valor superior a cierta cantidad (en este caso, 15).

db.players.updateMany(
   { scores: { $gte: 15 } },
   { $set: { "scores.$[e]" : 15 } },
   { arrayFilters: [ { "e": { $gte: 15 } } ] }
)

Resultado:

{ "acknowledged" : true, "matchedCount" : 3, "modifiedCount" : 3 } 

Como era de esperar, todos los documentos coinciden con los criterios y, por lo tanto, están actualizados. Sin embargo, no se actualizaron todos los elementos de la matriz.

Así es como se ven los documentos ahora.

db.players.find()

Resultado:

{ "_id" : 1, "scores" : [ 15, 15, 3 ] }
{ "_id" : 2, "scores" : [ 15, 15, 15 ] }
{ "_id" : 3, "scores" : [ 15, 15, 8 ] }

Los únicos elementos de la matriz que se actualizaron fueron aquellos con un valor superior a 15.

Más información

db.collection.updateMany() El método también acepta otros parámetros, como writeConcern , collation y hint .

Consulte la documentación de MongoDB para db.collections.updateMany() para más información.