¡INSCRÍBETE A CUALQUIER CURSO CON UN 50% DE DESCUENTO PARA NUEVOS CLIENTES!

En este tutorial vamos a ver algunos temas muy importantes a la hora de trabajar con mongoose, tales como relaciones, propiedades virtuales, definición de métodos estáticos y generación automática de timestamps.

Además de ver cómo relacionar modelos, también veremos cómo obtener y almacenar los datos relacionados, espero que te resulte útil.

Definir un modelo

Definir un esquema y un modelo en mongoose es muy sencillo, el siguiente ejemplo define un modelo user muy básico.


Así de sencillo es, con eso ya tenemos definido un modelo user a través del cuál podremos guardar y obtener información haciendo uso de mongodb.

Añadir timestamps

En mongoose, añadir los campos createdAt y updatedAt es muy sencillo, simplemente debemos definir nuestro modelo user de la siguiente forma.

Añadir propiedades virtuales

Las propiedades virtuales nos proveen getters y setters a través de los métodos get y set del método virtual de un esquema, y, gracias a ellos, podemos tener un código mucho mejor y más ordenado, aparte de eficiente y fácil de mantener.

Imagina que tienes un user con las propiedades firstName y lastName y necesitas mostrar esos datos en algún sitio, este sería un ejemplo básico pero útil. En lugar de hacer lo siguiente.


Podemos declarar una propiedad virtual como la siguiente.


Y utilizarlo de la siguiente forma.


Cómo puedes ver, definimos una propiedad virtual que no existe y la utilizamos a través del modelo user.

Crear métodos estáticos

Esta funcionalidad es genial, y realmente lo que hace es extender la funcionalidad de un modelo, en este caso, extender la funcionalidad con métodos, el siguiente ejemplo añade un nuevo método.


A través del esquema del ususario añadimos un nuevo método llamado findOneByUsername al cuál le pasamos el username y un callback, para utilizar este ejemplo lo siguiente es suficiente.

Relacionar modelos en mongoose

Parece lo más complejo cuando trabajamos con bases de datos nosql, pero cuando trabajamos con mongoose no es así, es realmente sencillo, nosotros vamos a crear un modelo posts al cuál le vamos a asociar un usuario, y a su vez, dentro de cada modelo post vamos a crear un array de objetos para almacenar los comentarios, y cada comentario tendrá su usuario asociado, veamos el esquema.


Ese modelo es completamente funcional para guardar posts y comentarios asociados a distintos usuarios, ahora veamos cómo podemos crear un nuevo post.


Simplemente creamos un nuevo post y definimos todas las propiedades que necesitamos, esto es bastante simple, la propiedad postedBy debe ser asignada con el _id del usuario.

Obtener el post es muy sencillo, pero si queremos obtener los datos del usuario al que hace referencia la propiedad postedBy no es tan obvio, el siguiente ejemplo no funciona.


Para obtener los datos del usuario que ha creado el post gracias a la referencia que hemos guardado en el modelo, simplemente debemos utilizar el método populate diciendo la propiedad que necesitamos, en este caso postedBy, el siguiente ejemplo funciona.

Añadir comentarios a nuestro post

Ahora vamos a ver cómo podemos añadir nuevos comentarios a un post, simplemente debemos obtener el post, definir el contenido de las propiedades y guardar de nuevo el documento.


Ahora ya tenemos un usuario, un post que hace referencia a un usuario y un comentario que también hace referencia a un usuario, sólo nos queda saber cómo podemos acceder al usuario que ha creado el comentario.


Simplemente utilizamos populate para postedBy y comments.postedBy, que son las propiedades que hacen referencia a los ususarios que han creado el post y el comentario.

Para finalizar, simplemente vamos a ver lo sencillo que es crear consultas utilizando una interfaz orientada a objetos con query builder, pero para este ejemplo simplemente voy a copiar y pegar lo que viene en la documentación, ya que me parece un ejemplo perfecto.


La consulta dice lo siguiente si lo traducimos a sql.


Ya puedes ver que es realmente sencillo y muy potente, creo que hemos dado un repaso importante al tema de bases de datos nosql con mongoose, si te ha gustado el post compártelo.