Validar Datos en MongoDB

MongoDBBeginner
Practicar Ahora

Introducción

En este laboratorio, aprenderá los fundamentos de la validación de datos en MongoDB. La validación de datos es una característica crucial que ayuda a mantener la integridad y consistencia de sus datos al garantizar que todos los documentos de una colección se adhieran a una estructura y reglas específicas. Aprenderá a crear colecciones con reglas de validación, a probar estas reglas intentando insertar datos válidos e inválidos, y a modificar las reglas de validación en una colección existente. Al final de este laboratorio, podrá aplicar la calidad de los datos directamente dentro de su base de datos MongoDB.

Crear una Colección con Validación de Esquema

En este primer paso, se conectará al servidor MongoDB y creará una nueva colección con reglas de validación específicas. Estas reglas definirán los tipos de datos esperados y las restricciones para los campos de sus documentos.

Primero, abra la Shell de MongoDB (mongosh) para interactuar con su base de datos. Esta shell interactiva es su herramienta principal para administrar MongoDB.

mongosh

Una vez dentro de la shell, verá un prompt como test>. Esto indica que está conectado a la base de datos predeterminada test. Vamos a crear y cambiar a una nueva base de datos llamada dataValidationLab.

use dataValidationLab

Ahora, creemos una colección llamada users. Al crear la colección, incluiremos un documento validator que utiliza $jsonSchema para definir nuestras reglas.

db.createCollection("users", {
  validator: {
    $jsonSchema: {
      bsonType: "object",
      required: ["name", "age", "email"],
      properties: {
        name: {
          bsonType: "string",
          description: "must be a string and is required"
        },
        age: {
          bsonType: "int",
          minimum: 18,
          description: "must be an integer >= 18 and is required"
        },
        email: {
          bsonType: "string",
          pattern: "^.+@.+$",
          description: "must be a valid email address and is required"
        }
      }
    }
  }
});

Después de ejecutar el comando, debería ver una salida que indica éxito:

{ "ok": 1 }

Analicemos el validador:

  • bsonType: "object": La raíz del documento debe ser un objeto.
  • required: ["name", "age", "email"]: Los campos name, age y email deben estar presentes en cada documento.
  • properties: Este objeto define las reglas para los campos individuales.
    • name: Debe ser un string.
    • age: Debe ser un int (entero) con un valor minimum de 18.
    • email: Debe ser un string que coincida con la expresión regular pattern, la cual verifica un formato básico de correo electrónico.

Ahora ha creado con éxito una colección con reglas de validación de datos. En el siguiente paso, probará estas reglas.

Probar la Validación Insertando Documentos

Ahora que su colección users tiene reglas de validación, vamos a probarlas. Intentará insertar varios documentos: algunos que violan las reglas y uno que las cumple. Esto le ayudará a comprender cómo MongoDB aplica el esquema.

Primero, intentemos insertar un documento con un tipo de dato incorrecto para el campo age. Proporcionaremos una cadena "25" en lugar de un entero.

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

Esta operación fallará. MongoDB rechazará el documento y devolverá un WriteError porque el campo age no cumple con el requisito bsonType: "int". El mensaje de error contendrá detalles sobre el fallo de validación.

MongoServerError: Document failed validation

A continuación, intentemos insertar un documento al que le falta un campo requerido, email.

db.users.insertOne({
  name: "Jane Doe",
  age: 30
});

Esto también fallará porque el campo email está listado en el array required en nuestro validador. Recibirá un WriteCommandError similar.

Finalmente, insertemos un documento que siga todas las reglas. El name y el email son cadenas, y age es un entero mayor o igual a 18.

db.users.insertOne({
  name: "Alice",
  age: 28,
  email: "alice@example.com"
});

Esta vez, el comando tendrá éxito y verá un mensaje de confirmación con el _id del documento recién insertado.

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

Para confirmar que el documento válido se agregó, puede consultar la colección.

db.users.find();

La salida mostrará el único documento que pasó la validación con éxito.

[
  {
    "_id": ObjectId("..."),
    "name": "Alice",
    "age": 28,
    "email": "alice@example.com"
  }
]

Modificar un Validador Existente

Los requisitos de su aplicación pueden cambiar con el tiempo y es posible que necesite actualizar sus reglas de validación. En este paso, aprenderá cómo modificar el validador de una colección existente utilizando el comando collMod y luego probar las nuevas reglas.

Supongamos que queremos agregar un nuevo campo status a nuestra colección users. Este campo debe ser una cadena y solo puede tener uno de dos valores: "active" o "inactive".

Usamos el comando collMod (collection modify) para aplicar el nuevo validador.

db.runCommand({
  collMod: "users",
  validator: {
    $jsonSchema: {
      bsonType: "object",
      required: ["name", "age", "email", "status"],
      properties: {
        name: {
          bsonType: "string",
          description: "must be a string and is required"
        },
        age: {
          bsonType: "int",
          minimum: 18,
          description: "must be an integer >= 18 and is required"
        },
        email: {
          bsonType: "string",
          pattern: "^.+@.+$",
          description: "must be a valid email address and is required"
        },
        status: {
          enum: ["active", "inactive"],
          description: "can only be one of the enum values and is required"
        }
      }
    }
  }
});

El comando devolverá { "ok": 1 } en caso de éxito. Ahora hemos actualizado el validador para requerir el campo status y restringir su valor utilizando la palabra clave enum.

Ahora, probemos la nueva regla. Intente insertar un documento con un estado no válido.

db.users.insertOne({
  name: "Bob",
  age: 45,
  email: "bob@example.com",
  status: "pending"
});

Esto fallará porque "pending" no está en la lista enum para el campo status. A continuación, inserte un documento que cumpla con las reglas actualizadas.

db.users.insertOne({
  name: "Bob",
  age: 45,
  email: "bob@example.com",
  status: "active"
});

Esta inserción tendrá éxito. Para ver todos los documentos de su colección, ejecute find() nuevamente.

db.users.find();

Ahora verá los documentos de Alice y Bob. Tenga en cuenta que el documento de Alice, insertado antes del cambio de regla, no tiene el campo status. Por defecto, la validación no se aplica a los documentos existentes hasta que se modifican.

Resumen

En este laboratorio, ha aprendido las técnicas esenciales para implementar la validación de datos en MongoDB. Comenzó creando una colección con un validador $jsonSchema para aplicar tipos de datos, campos requeridos y restricciones de valores. Luego probó estas reglas intentando insertar documentos tanto inválidos como válidos, observando cómo MongoDB rechaza los datos que no se ajustan al esquema. Finalmente, aprendió a modificar las reglas de validación para una colección existente utilizando el comando collMod para adaptarse a nuevos requisitos. Estas habilidades son fundamentales para construir aplicaciones robustas y mantener una alta calidad de datos en sus bases de datos MongoDB.