Cuando trabajas con MongoDB, la flexibilidad de una base de datos NoSQL no significa renunciar al control sobre la calidad de los datos. Validar tipos primitivos como string, number o boolean es solo el comienzo. La verdadera potencia aparece al aplicar reglas sobre estructuras más complejas: arrays y subdocumentos. Aquí se explica paso a paso cómo lograrlo usando JSON Schema dentro de las colecciones.
¿Cómo validar un array dentro de un documento en MongoDB?
Para este ejercicio se trabaja con una colección llamada products. Cada producto tiene un nombre obligatorio y, opcionalmente, un campo de tamaños (sizes) que representa las tallas disponibles de una camiseta, por ejemplo: ["L", "M"] [01:30].
Al definir el validador de la colección, el campo sizes se declara con BSON type array. Esto garantiza que, si alguien envía ese campo, debe llegar como un arreglo de datos y no como otro tipo.
Pero no basta con que sea un array: también es necesario controlar qué hay dentro. Para eso se utiliza la propiedad items del JSON Schema [02:40]. Dentro de items se indica el BSON type que deben tener los elementos internos. En este caso, cada elemento del array debe ser un string.
- Si se intenta insertar un número dentro del array de tamaños, la validación falla.
- Solo se aceptan valores de tipo string.
¿Qué reglas adicionales se pueden aplicar a los arrays?
MongoDB permite añadir restricciones más específicas sobre los arrays [03:50]:
uniqueItems: true: impide valores duplicados dentro del array. No podrías insertar ["L", "XL", "L"] porque "L" se repite.
minItems: 1: obliga a que, si el campo se envía, contenga al menos un elemento. Un array vacío [] no será válido.
Estas dos reglas combinadas aseguran que los tamaños sean únicos y que exista al menos uno cuando se decida incluir el campo. Si el campo sizes no se envía, el documento se crea sin problemas porque no es obligatorio [04:50].
Para aplicar cambios en el validador es necesario hacer un drop de la colección y volver a crearla con las nuevas reglas. Al hacerlo, los documentos previos también se eliminan.
¿Cómo validar un subdocumento con JSON Schema?
Un subdocumento es un documento embebido dentro de otro. Por ejemplo, un producto puede tener una categoría (category) que a su vez contiene un nombre y una imagen [06:30].
Para validar este tipo de estructura, se define category como una propiedad cuyo BSON type es object. Luego, dentro de ese objeto, se anidan las mismas reglas que se usarían en cualquier JSON Schema:
- Se declaran las
properties del subdocumento: name (tipo string) e image (tipo string).
- Se especifica un arreglo de
required indicando que name es obligatorio, mientras que image es opcional [07:15].
Esto significa que si se envía una categoría sin nombre, la inserción falla. Si se envía la imagen como un número en lugar de string, también falla. Solo cuando el subdocumento cumple todas las reglas — nombre presente y tipos correctos — el documento se inserta exitosamente [08:10].
¿Por qué es importante anidar validaciones en documentos NoSQL?
Aunque MongoDB es flexible por naturaleza, definir un JSON Schema con validaciones anidadas permite:
- Mantener la integridad de los datos en colecciones con estructuras complejas.
- Evitar inconsistencias cuando múltiples aplicaciones o servicios escriben en la misma base de datos.
- Establecer estándares claros sin perder la flexibilidad que ofrece NoSQL.
El concepto clave es que la validación se comporta de forma recursiva: cada subdocumento puede tener su propio esquema con propiedades, tipos y campos requeridos, exactamente igual que el documento raíz [07:50].
¿Qué otros tipos de validación se pueden explorar?
Una forma poderosa de validación que complementa estas técnicas es el uso de expresiones regulares (Regex). Con Regex es posible validar, por ejemplo, que un password cumpla con un mínimo de caracteres y contenga tanto números como letras [09:10]. Este tipo de validación agrega una capa adicional de control sobre los valores de tipo string.
¿Ya probaste validar arrays con uniqueItems en tus propios proyectos? Comparte tu experiencia y cuéntanos qué otras reglas de validación te han resultado útiles.