Manejar Errores de MongoDB

MongoDBBeginner
Practicar Ahora

Introducción

En este laboratorio, aprenderá técnicas esenciales para manejar errores comunes en MongoDB. Usando la Shell de MongoDB (mongosh), practicará la identificación y resolución de varios problemas, incluyendo fallos de conexión, errores de clave duplicada y errores de validación de datos. Al final de este laboratorio, tendrá una comprensión práctica de cómo hacer que sus operaciones de base de datos sean más confiables y robustas.

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 100%. Ha recibido una tasa de reseñas positivas del 100% por parte de los estudiantes.

Conexión a MongoDB y Manejo de Errores

Los errores de conexión son un problema común al trabajar con cualquier base de datos. Pueden ocurrir por varias razones, como una dirección de servidor incorrecta, problemas de red o que el servidor de la base de datos no esté en ejecución. En este paso, aprenderá a identificar un error de conexión y luego a conectarse con éxito.

Primero, intente conectarse a una instancia de MongoDB en un puerto donde no se esté ejecutando. El puerto predeterminado para MongoDB es 27017. Intentaremos conectarnos al puerto 27018.

Ejecute el siguiente comando en su terminal:

mongosh "mongodb://localhost:27018"

Este comando falla y devuelve un error porque la shell no puede encontrar un servidor MongoDB en la dirección especificada. La salida será similar a esta:

MongoNetworkError: connect ECONNREFUSED 127.0.0.1:27018

El MongoNetworkError indica claramente un fallo en la conexión. La parte ECONNREFUSED le dice que la máquina de destino rechazó activamente la conexión, lo que generalmente significa que ningún servicio está escuchando en ese puerto.

Ahora, conectémonos al puerto correcto. El servicio de MongoDB se inició por usted durante la fase de configuración. Para conectarse a él, ejecute el comando mongosh sin argumentos. Esto utilizará la cadena de conexión predeterminada mongodb://127.0.0.1:27017.

mongosh

Tras una conexión exitosa, verá un mensaje de bienvenida y el prompt test>, lo que indica que está conectado a la base de datos test predeterminada.

Current Mongosh Log ID: ...
Connecting to:          mongodb://127.0.0.1:27017/?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+2.2.6
Using MongoDB:          8.0.0
Using Mongosh:          2.2.6
...
test>

Ahora está conectado al servidor MongoDB. Por favor, mantenga esta terminal abierta y permanezca en la shell mongosh para los siguientes pasos.

Manejar Errores de Clave Duplicada

Mantener la integridad de los datos es crucial para cualquier aplicación. Uno de los problemas más comunes de integridad de datos son los registros duplicados. MongoDB previene esto a través de índices únicos, que aseguran que un campo indexado no almacene valores duplicados.

Ya debería estar en la shell mongosh del paso anterior. Primero, cambie a una nueva base de datos llamada errorlab. Una base de datos se crea automáticamente la primera vez que se almacenan datos en ella.

use errorlab

A continuación, cree un índice único en el campo email en una nueva colección users. Este comando le indica a MongoDB que cada documento en la colección users debe tener un valor único para el campo email.

db.users.createIndex({ email: 1 }, { unique: true });

La salida confirma que el índice se creó correctamente.

{
  "numIndexesBefore": 1,
  "numIndexesAfter": 2,
  "createdCollectionAutomatically": true,
  "ok": 1
}

Ahora, inserte un documento en la colección users. Esta operación tendrá éxito porque la colección está vacía y el correo electrónico es único.

db.users.insertOne({ name: "John Doe", email: "john@example.com" });

Verá un mensaje de confirmación con el ID del documento insertado:

{
  "acknowledged": true,
  "insertedId": ObjectId("...")
}

A continuación, intente insertar otro documento con la misma dirección de correo electrónico.

db.users.insertOne({ name: "Jane Doe", email: "john@example.com" });

Esta vez, la operación falla. MongoDB devuelve un MongoBulkWriteError con un código de error específico, E11000, que significa un error de clave duplicada. Este es el comportamiento esperado para proteger la integridad de los datos.

MongoServerError: E11000 duplicate key error collection: errorlab.users index: email_1 dup key: { email: "john@example.com" }

Resolver Claves Duplicadas con Upsert

Prevenir duplicados es bueno, pero a veces quieres actualizar un registro si existe o crearlo si no. Esta lógica de "actualizar o insertar" es un requisito común. MongoDB proporciona una forma limpia de hacer esto utilizando la opción upsert.

Intentemos actualizar al usuario con el correo electrónico john@example.com. Usaremos el método updateOne con la opción upsert establecida en true.

db.users.updateOne(
  { email: "john@example.com" },
  { $set: { name: "John Doe Updated", lastUpdated: new Date() } },
  { upsert: true }
);

La salida muestra que se encontró y modificó un documento. El upsertedId es null porque se actualizó un documento existente, no se insertó uno nuevo.

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

Ahora, ejecutemos un comando similar para un usuario que aún no existe, jane@example.com.

db.users.updateOne(
  { email: "jane@example.com" },
  { $set: { name: "Jane Doe", lastUpdated: new Date() } },
  { upsert: true }
);

Esta vez, la salida muestra que matchedCount es 0, pero se creó un nuevo documento, como lo indica upsertedId.

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

Para verificar los resultados, puede consultar la colección para ver todos los documentos. El método pretty() formatea la salida para facilitar la lectura.

db.users.find().pretty();

La salida mostrará ambos documentos: el documento de John con el nombre actualizado y el documento recién creado de Jane. La opción upsert proporciona una forma potente y atómica de manejar escenarios de "crear o actualizar".

Manejar Errores de Consulta y Validación

Los errores también pueden ocurrir cuando consulta datos o cuando los datos insertados no se ajustan a las reglas predefinidas. En este paso, explorará un error de sintaxis de consulta y un error de validación de datos.

Primero, veamos qué sucede cuando utiliza un operador de consulta que no existe. Esto es un error tipográfico común.

db.users.find({ name: { $invalidOperator: "John" } });

MongoDB devuelve inmediatamente un error porque no reconoce $invalidOperator.

MongoServerError[BadValue]: unknown operator: $invalidOperator

A continuación, exploremos una característica más potente: la validación de esquemas. Puede definir reglas que los documentos deben seguir para ser insertados o actualizados en una colección. Creemos una nueva colección products con un validador que requiere un name (cadena) y un price (número).

db.createCollection("products", {
  validator: {
    $jsonSchema: {
      bsonType: "object",
      required: ["name", "price"],
      properties: {
        name: {
          bsonType: "string",
          description: "must be a string and is required"
        },
        price: {
          bsonType: "number",
          description: "must be a number and is required"
        }
      }
    }
  }
});

Ahora, intente insertar un documento que viola este esquema proporcionando el price como una cadena en lugar de un número.

db.products.insertOne({ name: "Laptop", price: "1200" });

La operación falla con un MongoBulkWriteError. El mensaje Document failed validation indica claramente la razón, evitando que datos incorrectos ingresen a su base de datos.

MongoServerError: Document failed validation
...

Finalmente, inserte un documento válido que cumpla con el esquema.

db.products.insertOne({ name: "Laptop", price: 1200 });

Esta operación tiene éxito porque el documento es válido.

{
  "acknowledged": true,
  "insertedId": ObjectId("...")
}

La validación de esquemas es una herramienta potente para hacer cumplir la consistencia de los datos directamente dentro de la base de datos.

Resumen

En este laboratorio, ha aprendido a manejar varios tipos comunes de errores de MongoDB utilizando la shell mongosh. Comenzó identificando y resolviendo un error de conexión. Luego, aplicó la integridad de los datos creando un índice único para prevenir errores de claves duplicadas. También aprendió a usar la opción upsert para manejar de manera eficiente la lógica de "actualizar o insertar". Finalmente, exploró errores de sintaxis de consulta y utilizó la validación de esquemas para evitar que datos no válidos se guarden en su base de datos. Estas habilidades fundamentales de manejo de errores son esenciales para construir aplicaciones confiables y robustas con MongoDB.