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.