Actualizar Registros en MongoDB

MongoDBBeginner
Practicar Ahora

Introducción

En este laboratorio, aprenderá a actualizar documentos en una colección de MongoDB. Comenzará modificando un solo documento utilizando el método updateOne(). Luego, aprenderá a modificar varios documentos a la vez con el método updateMany(). También trabajará con varios operadores de actualización como $set, $inc y $unset para realizar modificaciones específicas. Finalmente, explorará la opción upsert, que le permite actualizar un documento existente o crear uno nuevo si no existe. Este laboratorio proporciona un enfoque práctico y directo para dominar las habilidades fundamentales de manipulación de datos en MongoDB.

Este es un Guided Lab, que proporciona instrucciones paso a paso para ayudarte a aprender y practicar. Sigue las instrucciones cuidadosamente para completar cada paso y obtener experiencia práctica. Los datos históricos muestran que este es un laboratorio de nivel principiante con una tasa de finalización del 90%. Ha recibido una tasa de reseñas positivas del 99% por parte de los estudiantes.

Actualizar un Documento Individual con updateOne

En este paso, aprenderá a modificar un solo documento en una colección de MongoDB. Utilizaremos el método updateOne() junto con el operador $set para cambiar el valor de un campo en un documento específico.

Primero, abra la Shell de MongoDB para interactuar con su base de datos.

mongosh

Una vez dentro de la shell, cambie a la mylab_database que se preparó para usted.

use mylab_database

Veamos los documentos actuales en la colección books. El método .pretty() formatea la salida para hacerla más legible.

db.books.find().pretty();

Debería ver los tres documentos de libros iniciales. Los valores de _id serán únicos en su entorno.

[
  {
    _id: ObjectId("..."),
    title: 'JavaScript Fundamentals',
    author: 'Mike Johnson',
    year: 2022,
    pages: 350
  },
  {
    _id: ObjectId("..."),
    title: 'Python Deep Dive',
    author: 'Sarah Williams',
    year: 2021,
    pages: 450
  },
  {
    _id: ObjectId("..."),
    title: 'Machine Learning Basics',
    author: 'John Doe',
    year: 2020,
    price: 39.99
  }
]

Ahora, actualicemos el año de publicación del libro "JavaScript Fundamentals" a 2023.

db.books.updateOne(
  { title: "JavaScript Fundamentals" },
  { $set: { year: 2023 } }
);

Analicemos este comando:

  • updateOne(): Este método encuentra el primer documento que coincide con el filtro y lo actualiza.
  • { title: "JavaScript Fundamentals" }: Este es el documento de filtro. Le indica a MongoDB que busque un documento donde el campo title sea "JavaScript Fundamentals".
  • { $set: { year: 2023 } }: Este es el documento de actualización. El operador $set reemplaza el valor del campo year con 2023.

El comando devuelve un objeto de resultado que confirma la operación.

{
  "acknowledged": true,
  "insertedId": null,
  "matchedCount": 1,
  "modifiedCount": 1,
  "upsertedCount": 0
}

matchedCount: 1 indica que un documento coincidió con nuestro filtro, y modifiedCount: 1 indica que un documento se actualizó correctamente.

Para verificar el cambio, busque el documento nuevamente.

db.books.findOne({ title: "JavaScript Fundamentals" });

La salida mostrará el documento actualizado con el nuevo año.

{
  _id: ObjectId("..."),
  title: 'JavaScript Fundamentals',
  author: 'Mike Johnson',
  year: 2023,
  pages: 350
}

Actualizar Múltiples Documentos con updateMany

A veces necesita actualizar varios documentos a la vez. Para esto, MongoDB proporciona el método updateMany(). En este paso, agregará un nuevo campo a todos los libros publicados antes de un año determinado.

Agreguemos un campo status con el valor "Classic" a todos los libros publicados antes de 2022.

db.books.updateMany({ year: { $lt: 2022 } }, { $set: { status: "Classic" } });

Aquí hay una explicación del comando:

  • updateMany(): Este método actualiza todos los documentos que coinciden con el filtro especificado.
  • { year: { $lt: 2022 } }: Este filtro selecciona documentos donde el year es menor que 2022. El operador $lt significa "less than" (menor que).
  • { $set: { status: "Classic" } }: Este documento de actualización agrega un nuevo campo status con el valor "Classic" a todos los documentos coincidentes.

La salida mostrará cuántos documentos fueron encontrados y modificados. En nuestro caso, dos libros fueron publicados antes de 2022.

{
  "acknowledged": true,
  "insertedId": null,
  "matchedCount": 2,
  "modifiedCount": 2,
  "upsertedCount": 0
}

Para verificar que ambos documentos fueron actualizados, puede consultar todos los libros con el estado "Classic".

db.books.find({ status: "Classic" }).pretty();

Verá los dos libros que ahora incluyen el campo status.

[
  {
    _id: ObjectId("..."),
    title: 'Python Deep Dive',
    author: 'Sarah Williams',
    year: 2021,
    pages: 450,
    status: 'Classic'
  },
  {
    _id: ObjectId("..."),
    title: 'Machine Learning Basics',
    author: 'John Doe',
    year: 2020,
    price: 39.99,
    status: 'Classic'
  }
]

Uso de Más Operadores de Actualización: $inc y $unset

MongoDB ofrece una variedad de operadores para diferentes tipos de actualizaciones. En este paso, aprenderá a usar $inc para modificar valores numéricos y $unset para eliminar campos de un documento.

Primero, usemos el operador $inc para aumentar el número de páginas del libro "Python Deep Dive" en 50. El operador $inc incrementa un campo en un valor especificado.

db.books.updateOne({ title: "Python Deep Dive" }, { $inc: { pages: 50 } });

Para confirmar el cambio, recupere el documento.

db.books.findOne({ title: "Python Deep Dive" });

El campo pages ahora debería ser 500 (450 + 50).

{
  _id: ObjectId("..."),
  title: 'Python Deep Dive',
  author: 'Sarah Williams',
  year: 2021,
  pages: 500,
  status: 'Classic'
}

A continuación, eliminemos el campo price del documento "Machine Learning Basics". El operador $unset elimina un campo particular. El valor proporcionado a $unset (en este caso, "") no importa y puede ser cualquier valor.

db.books.updateOne(
  { title: "Machine Learning Basics" },
  { $unset: { price: "" } }
);

Verifiquemos que el campo price ha sido eliminado.

db.books.findOne({ title: "Machine Learning Basics" });

La salida mostrará el documento sin el campo price.

{
  _id: ObjectId("..."),
  title: 'Machine Learning Basics',
  author: 'John Doe',
  year: 2020,
  status: 'Classic'
}

Crear Documentos con upsert

Un "upsert" es un tipo especial de operación de actualización que actualiza un documento si existe o inserta uno nuevo si no lo hace. Esto es útil para evitar la lógica separada de "verificar-luego-insertar" y asegura la atomicidad en las operaciones de base de datos. Los upserts son particularmente valiosos en escenarios donde se desea:

  • Asegurar la consistencia de los datos: En lugar de verificar primero si un documento existe y luego decidir si insertar o actualizar, se puede realizar una única operación que maneje ambos casos atómicamente.
  • Manejar operaciones concurrentes: En entornos multiusuario, un upsert previene las condiciones de carrera (race conditions) donde otro proceso podría insertar el mismo documento entre las operaciones de verificación e inserción.
  • Simplificar la lógica de la aplicación: Reduce la necesidad de lógica condicional compleja en el código de la aplicación, haciéndolo más mantenible y menos propenso a errores.

Puede habilitar este comportamiento añadiendo la opción upsert: true a su comando de actualización.

Intentemos añadir un nuevo libro, "Cloud Computing Essentials". Dado que este libro no existe en nuestra colección, la operación upsert lo creará.

db.books.updateOne(
  { title: "Cloud Computing Essentials" },
  { $set: { author: "David Lee", year: 2023, pages: 300 } },
  { upsert: true }
);

El comando consta de tres partes:

  1. El filtro: { title: "Cloud Computing Essentials" }
  2. La actualización: { $set: { ... } }
  3. Las opciones: { upsert: true }

Debido a que ningún documento coincidió con el filtro, se creó uno nuevo. El objeto de resultado lo refleja incluyendo un upsertedId.

{
  acknowledged: true,
  matchedCount: 0,
  modifiedCount: 0,
  upsertedCount: 1,
  upsertedId: ObjectId("...")
}

Ahora, ejecutemos el mismo comando de nuevo. Esta vez, MongoDB encontrará el documento que acabamos de crear y lo actualizará.

db.books.updateOne(
  { title: "Cloud Computing Essentials" },
  { $set: { author: "David Lee", year: 2023, pages: 300 } },
  { upsert: true }
);

El resultado ahora muestra matchedCount: 1. Dado que los datos que estamos estableciendo son los mismos que los datos existentes, modifiedCount es 0. Si hubiéramos cambiado un valor, modifiedCount sería 1.

{
  "acknowledged": true,
  "insertedId": null,
  "matchedCount": 1,
  "modifiedCount": 0,
  "upsertedCount": 0
}

Puede verificar que el nuevo libro existe en la colección.

db.books.findOne({ title: "Cloud Computing Essentials" });

La salida mostrará el documento recién creado.

{
  _id: ObjectId("..."),
  title: 'Cloud Computing Essentials',
  author: 'David Lee',
  year: 2023,
  pages: 300
}

Cuando haya terminado, puede salir del Shell de MongoDB.

exit;

Resumen

En este laboratorio, ha aprendido las técnicas esenciales para actualizar documentos en MongoDB. Ha practicado la modificación de documentos individuales con updateOne y de múltiples documentos con updateMany. También ha explorado potentes operadores de actualización, como $set para cambiar valores de campos, $inc para incrementar números y $unset para eliminar campos. Finalmente, ha aprendido a utilizar la opción upsert para crear un documento si aún no existe. Estas habilidades son fundamentales para gestionar y mantener datos en cualquier aplicación de MongoDB.