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

4 formas de actualizar un documento en MongoDB

MongoDB proporciona varias formas de actualizar un documento. El método que utilice dependerá exactamente de cómo desee realizar la actualización.

Este artículo presenta 4 formas de actualizar un documento en MongoDB.

El db.collection.updateOne() Método

db.collection.updateOne() El método hace exactamente lo que promete su nombre:actualiza un documento.

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" }

Podríamos 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.

El db.collection.updateMany() Método

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

Usemos los documentos originales de la colección:

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

Una vez más, 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" }

El db.collection.update() Método

El db.collection.update() El método puede actualizar un solo documento o varios documentos en una colección.

Por defecto, solo actualiza un único documento. Pero si multi: true se especifica, luego actualiza todos los documentos que coinciden con los criterios de consulta.

Actualizar un solo documento

Usemos la colección original de documentos nuevamente:

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

Podríamos actualizar un documento como este:

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

Resultado:

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

Solo se actualizó un documento. Esto se confirma cuando consultamos la colección.

db.pets.find()

Resultado:

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

Actualizar varios documentos

Volvamos de nuevo a la colección original de documentos:

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

Y ahora agregaremos multi: true a nuestra operación de actualización para actualizar todos los documentos que coincidan con los criterios de consulta:

db.pets.update( 
    { type: "Dog" },
    { $set: { type: "Cow" } },
    { multi: true }
    )

Resultado:

WriteResult({ "nMatched" : 2, "nUpserted" : 0, "nModified" : 2 }) 

Así que esta vez se compararon y actualizaron dos documentos.

Veamos nuestra colección de nuevo:

db.pets.find()

Resultado:

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

Como era de esperar, ambos documentos ahora tienen un type de Cow .

El db.collection.replaceOne() Método

db.collection.replaceOne() El método reemplaza un solo documento dentro de la colección según el filtro.

Nuevamente usando la colección original:

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

Veamos qué sucede cuando usamos db.collection.replaceOne() método en su contra.

db.pets.replaceOne( 
    { type: "Dog" },
    { type: "Cow" }
    )

Resultado:

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

Se actualizó un documento.

Echemos un vistazo.

db.pets.find()

Resultado:

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

Esta vez, todo el documento fue reemplazado por el nuevo documento (excepto el _id campo).

Este método reemplaza todo el documento (excepto el _id campo).

Inserción

Todos los métodos anteriores aceptan un upsert argumento que le permite realizar una operación upsert.

Cuando upsert: true , el documento se actualiza si coincide con los criterios de consulta, pero si no coincide, se inserta un nuevo documento.

Ejemplo:

db.pets.updateOne( 
    { name: "Wag" },
    { $set: { type: "Cow" } },
    { upsert: true }
    )

Resultado:

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

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

Revisemos la colección.

db.pets.find()

Resultado:

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