En MongoDB el db.collection.updateOne()
El método actualiza un solo documento dentro de la colección según el filtro.
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 actualizar un documento como este:
db.pets.updateOne(
{ type: "Dog" },
{ $set: { type: "Cow" } }
)
Resultado:
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
Eso actualizó solo un documento, aunque dos documentos coinciden con los criterios de filtro (los criterios son type: "Dog"
).
Podemos comprobar los resultados así:
db.pets.find()
Resultado:
{ "_id" : 1, "name" : "Wag", "type" : "Cow" } { "_id" : 2, "name" : "Bark", "type" : "Dog" } { "_id" : 3, "name" : "Meow", "type" : "Cat" }
El primer documento ahora tiene un type
de Cow
en lugar de Dog
, pero el segundo documento no se vio afectado, aunque también coincidía con los criterios de filtrado.
Inserción
db.collection.updateOne()
método acepta un upsert
argumento que le permite realizar una operación upsert.
Cuando upsert: true
, el documento se actualiza si coincide con los criterios de filtro, pero si no coincide, 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.updateOne(
{ name: "Bubbles" },
{ $set: { type: "Fish" } },
{ upsert: true }
)
Resultado:
{ "acknowledged" : true, "matchedCount" : 0, "modifiedCount" : 0, "upsertedId" : ObjectId("5fe1e94dd991410169410199") }
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("5fe1e94dd991410169410199"), "name" : "Bubbles", "type" : "Fish" }
Documentos incrustados
También puede usar db.collection.updateOne()
para actualizar documentos incrustados.
Supongamos que tenemos el siguiente documento:
{ "_id" : 1, "name" : "Wag", "type" : "Dog", "specs" : { "height" : 400, "weight" : 15, "color" : "brown" } }
Podemos usar el siguiente código para actualizar el documento incrustado.
db.pets.updateOne({
_id: 1
}, {
$set: {
"specs.weight": 20,
"specs.color": "blue"
}
})
Resultado:
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
Entonces podemos ver que un documento fue actualizado.
Revisemos el documento.
db.pets.find({
_id: 1
}).pretty()
Resultado:
{ "_id" : 1, "name" : "Wag", "type" : "Dog", "specs" : { "height" : 400, "weight" : 20, "color" : "blue" } }
Podemos ver que el documento incrustado se actualizó según lo especificado.
Arreglos
Usemos db.collection.updateOne()
para actualizar una matriz.
Supongamos que tenemos el siguiente documento:
{ "_id" : 1, "name" : "Wag", "type" : "Dog", "awards" : [ "Top Dog", "Best Dog", "Biggest Dog" ] }
Actualicemos dos de los elementos de la matriz y el nombre del perro.
db.pets.updateOne({
_id: 1
}, {
$set: {
"name": "Bark",
"awards.0": "Bottom Dog",
"awards.1": "Worst Dog"
}
})
Resultado:
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
Podemos ver que un documento fue actualizado.
Y veamos el documento.
db.pets.find().pretty()
Resultado:
{ "_id" : 1, "name" : "Bark", "type" : "Dog", "awards" : [ "Bottom Dog", "Worst Dog", "Biggest Dog" ] }
Los arrayFilters
Parámetro
También puede usar los arrayFilters
parámetro y el posicional $
operador para determinar qué elementos de la matriz actualizar.
Por ejemplo, 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 ] }
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, 10).
db.players.updateOne(
{ scores: { $gte: 10 } },
{ $set: { "scores.$[e]" : 10 } },
{ arrayFilters: [ { "e": { $gte: 10 } } ] }
)
Resultado:
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
Como era de esperar, esto solo actualiza un documento, aunque dos documentos coinciden con los criterios.
Así es como se ven los documentos ahora.
db.players.find()
Resultado:
{ "_id" : 1, "scores" : [ 1, 5, 3 ] } { "_id" : 2, "scores" : [ 8, 10, 10 ] } { "_id" : 3, "scores" : [ 15, 11, 8 ] }
El documento 2 tenía dos elementos de matriz actualizados, porque esos elementos coincidían con los criterios.
Más información
db.collection.updateOne()
El método también acepta otros parámetros, como writeConcern
, collation
y hint
.
Consulte la documentación de MongoDB para db.collections.updateOne()
para más información.