Esquemas en Mongoose: Definición y uso

Esquemas en Mongoose: Definición y uso

¿Qué es un Schema en Mongoose y para qué se utiliza?

En Mongoose, un Schema (Esquema) es la estructura que indica cual es la forma en la que están estructurados los documentos que se almacenan en una colección de MongoDB. Cada schema esta compuesto por campos y tipos de datos permitidos, además de opciones para llevar acabo validación de dichos documentos.

Los schemas se utilizan para especificar el modelo de los datos de una aplicación, en este caso Mongoose para una aplicación construida en NodeJS. Cuando se construye un schema se genera una estructura y reglas de validación de los datos, para que estos sean analizados y validados previo a su captura.

En otras palabras, los esquemas sirven como guías de la estructura de los documentos. Estos son necesitados para la creación del modelo. Así que antes de utilizar los modelos de manera apropiada, es necesario definir sus esquemas.

¿Cómo crear un Schema en Mongoose?

const esquemaDeLibro = mongoose.Schema({
    name: String,
});

Mongoose ignora todas las propiedades que no sean definidas dentro del modelo de un esquema.

¿Cuales son los diferentes tipos de datos que existen en Mongoose?

Los esquemas en Mongoose soportan estos tipos de datos.

Tipo Descripción
String Cadena de caracteres
Number Número
Date Fecha y hora
Boolean Valor booleano
ObjectID Identificador único de un documento
Mixed Tipo genérico que puede contener cualquier tipo de dato
Buffer Almacenamiento de datos binarios
Array Colección de elementos con un tipo específico
Schema.Types.String Cadena de caracteres
Schema.Types.Number Número
Schema.Types.Date Fecha y hora
Schema.Types.Boolean Valor booleano
Schema.Types.ObjectId Identificador único de un documento
Schema.Types.Mixed Tipo genérico que puede contener cualquier tipo de dato
Schema.Types.Buffer Almacenamiento de datos binarios
Schema.Types.Array Colección de elementos con un tipo específico

Mongoose no vigila los cambios realizados al tipo mixed-type, asi que hay que invocar markModified() antes de guardar el objeto para asegurarse que los cambios aplicados a este cambio sean persistentes. El ObjectId es agregado de forma automática si es omitido en un insert o save.

Ejemplo del uso de esquemas en Mongoose

El siguiente es un ejemplo sencillo del uso de esquemas en Mongoose.

const ObjectId = mongoose.Schema.Types.ObjectId;
const Mixed = mongoose.Schema.Types.Mixed;
const esquemaDelLibro = mongoose.Schema({
    nombre: String,
    creado_en: Date,
    actualizado_en: { type: Date, default: Date.now },
    publicado: Boolean,
    idDelAuthor: {
        type: ObjectId,
        required: true,
    },
    descripcion: {
        type: String,
        default: null,
    },
    activo: {
        type: Boolean,
        default: false,
    },
    version: {
        type: Number,
        default: function () {
            return 1;
        },
    },
    contribuyentes: [ObjectId],
});

Es posible crear tipos personalizados utilizando mongoose-types, estos pueden ser por ejemplo urls, emails, direcciones, etc.

Los esquemas se pueden conectar entre si. Lo que significa que cierta funcionalidad puede ser extendida a través de todos los esquemas de la aplicación.

Para una mejor organización y reutilización del código, podemos crear métodos para las instancias, aplicar plugins y definir hooks.

Para procesos de validación se recomienda el uso de validator.js y express-validator.

¿Cómo agregar validaciones a campos en un Schema en Mongoose?

Para validar un documento mediante un Schema se pueden utilizar la opciones de validación que ofrece Mongoose. Cuando se especifican estas opciones dentro del Schema, se pueden aplicar dichas validaciones a los datos antes de qu estos sean capturados.

Un ejemplo de esto, es cuando el valor de un campo este presente, es decir required.

const productSchema = new Schema({
    name: {
        type: String,
        required: true,
    },
    price: Number,
});

En este ejemplo la opción required como true le indica a Mongoose que el valor debe estar presente.

¿Qué otros validadores soportan los Schemas de Mongoose?

La siguiente tabla muestra una lista de validadores disponibles en los schemas de mongoose.

Validador Descripción
required Requerido
min Valor mínimo numérico
max Valor máximo numérico
minlength Longitud mínima de una cadena
maxlength Longitud máxima de una cadena
enum Valor permitido de un conjunto de valores
match Expresión regular para validar una cadena
validate Validador personalizado para un campo
unique Indica que el valor de este campo debe ser único en la colección
sparse Permite que el campo sea nulo o no exista para algunos documentos