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.
const esquemaDeLibro = mongoose.Schema({ name: String, });
Mongoose ignora todas las propiedades que no sean definidas dentro del modelo de un esquema.
Los esquemas en Mongoose soportan estos tipos de datos.
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
.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
.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.La siguiente tabla muestra una lista de validadores disponibles en los schemas de mongoose.