Actualización de datos del documento de MongoDB usando mongo shell

Este capítulo presenta la actualización de los datos del documento de MongoDB a través de la mongo shell. MongoDB soporta diferentes formas de actualización implementadas por varios tipos de operadores, y también admite múltiples funciones de actualización.

Preparar datos de prueba

Inserta un lote de datos de prueba en la colección de inventario.

db.inventory.insertMany( [
   { item: "lienzo", qty: 100, size: { h: 28, w: 35.5, uom: "cm" }, status: "A" },
   { item: "diario", qty: 25, size: { h: 14, w: 21, uom: "cm" }, status: "A" },
   { item: "tapete", qty: 85, size: { h: 27.9, w: 35.5, uom: "cm" }, status: "A" },
   { item: "mousepad", qty: 25, size: { h: 19, w: 22.85, uom: "cm" }, status: "P" },
   { item: "libreta", qty: 50, size: { h: 8.5, w: 11, uom: "pulgadas" }, status: "P" },
   { item: "papel", qty: 100, size: { h: 8.5, w: 11, uom: "pulgadas" }, status: "D" },
   { item: "planificador", qty: 75, size: { h: 22.85, w: 30, uom: "cm" }, status: "D" },
   { item: "tarjeta postal", qty: 45, size: { h: 10, w: 15.25, uom: "cm" }, status: "A" },
   { item: "cuaderno de dibujo", qty: 80, size: { h: 14, w: 21, uom: "cm" }, status: "A" },
   { item: "bloque de dibujo", qty: 95, size: { h: 22.85, w: 30.5, uom: "cm" }, status: "A" }
] );

Sintaxis del operador de actualización

Para actualizar documentos, MongoDB proporciona múltiples operadores de actualización (por ejemplo, $set) para modificar los valores de los campos.

El formato de los parámetros del operador de actualización es el siguiente:

{
  <operador de actualización>: { <campo1>: <valor1>, ... },
  <operador de actualización>: { <campo2>: <valor2>, ... },
  ...
}

Explicación:

  • <operador de actualización>: Operador de actualización
  • : Nombre del campo
  • : Parámetro del campo

Operador $set

Se utiliza para actualizar documentos y crear un nuevo campo si el campo no existe.

Actualizar un solo documento

Actualiza un documento utilizando el método db.collection.updateOne().

db.inventory.updateOne(
   { item: "papel" },
   {
     $set: { "size.uom": "cm", status: "P" },
     $currentDate: { lastModified: true }
   }
)

Explicación de la actualización:

  • Primero, recupera el primer documento usando la condición de consulta (item = papel).
  • Utiliza el operador $set para actualizar el valor del campo size.uom a cm y actualizar el valor del campo status a P.
  • Utiliza el operador $currentDate para actualizar el valor del campo lastModified a la fecha actual. Si el campo lastModified no existe, $currentDate creará el campo.

Actualizar múltiples documentos

Utiliza el método db.collection.updateMany() para actualizar varios documentos que cumplan la condición.

db.inventory.updateMany(
   { "qty": { $lt: 50 } },
   {
     $set: { "size.uom": "pulgadas", status: "P" },
     $currentDate: { lastModified: true }
   }
)

Explicación de la actualización:

  • Primero, recupera todos los documentos utilizando la condición de consulta (qty < 50).
  • Utiliza el operador $set para actualizar el valor del campo size.uom a pulgadas y actualizar el valor del campo status a P.
  • Utiliza el operador $currentDate para actualizar el valor del campo lastModified a la fecha actual. Si el campo lastModified no existe, $currentDate creará el campo.

Consejo: El operador $lt representa el significado de menor que.

Reemplazar Documento

Utiliza el método db.collection.replaceOne() para reemplazar el contenido de un documento (excepto el campo _id). El documento de reemplazo puede tener campos diferentes al documento original. Dado que el campo _id es inmutable, puede ser omitido. Sin embargo, si incluyes el campo _id, el valor del id debe ser consistente con el id del documento que está siendo actualizado.

db.inventory.replaceOne(
   { item: "papel" },
   { item: "papel", instock: [ { almacen: "A", cantidad: 60 }, { almacen: "B", cantidad: 40 } ] }
)

Explicación:

  • Primero, utiliza el criterio de consulta (item=papel) para recuperar el primer documento.
  • Reemplaza el documento coincidente con el contenido del segundo parámetro del método replaceOne.

Comportamiento de Actualización

Atomicidad

Todas las operaciones de escritura en MongoDB son atómicas a nivel de documento individual.

Campo _id

El campo _id es inmutable y no puede ser actualizado.