¿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 uninsert
osave
.
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 |