Ver contenido

carlosazaustre.es carlosazaustre.es

Cómo relacionar tus modelos en MongoDB

🗓 | 💻 Desarrollo | 🕐 1 minutos de lectura | 💬 Comments

MongoDB es una base de datos no relacional, es decir no es como las típicas bases de datos SQL (MySQL, Oracle, PostgreSQL, etc...) donde existen relaciones entre una tabla y otra. Veamos un ejemplo clásico.

Imaginemos una base de datos de libros. Tendríamos una tabla con los títulos de los libros y otra con los datos de los autores. El campo autor en la tabla de libros, apuntaría a un ID o clave primaria de un autor de la tabla autores.

En MongoDB podemos hacer algo parecido, por medio de referencias y el método populate de MongoDB.

Sigamos con el ejemplo anterior. Un modelo autor en Node.js usando mongoose sería tal que así:

y supongamos un modelo sencillo para libro de la siguiente manera:

Si nos fijamos, para el campo autor en el modelo libro hemos usado el tipo Schema.ObjectId y la referencia al modelo Autor. Esto nos permitirá establecer la relación entre un campo de una tabla y otra.

Pero si no tenemos consultas SQL, y pedimos una lista de todos los libros en la base de datos ¿Qué datos nos llegarán?

Lo primero que programaríamos sería esto (en Express/Node.js):

y si tenemos varios libros registrados en la base de datos, nos devolvería un JSON parecido a este:

En el campo autor obtenemos la referencia en formato ObjectID del autor, pero no su ficha completa. ¿Qué pasa si queremos mostrar en un sólo JSON toda la información para poder pintarla de una sola llamada en nuestra webapp? Para eso necesitamos hacer uso del método populate de MongoDB que también implementa la librería mongoose.

En nuestro controlador anterior, debemos ampliarlo con lo siguiente:

La línea Autor.populate(libros, {path: "autor"},...); toma el array de objectos libros y le indica que en la ruta autor lo "popule" con los datos del modelo Autor. Quedando una respuesta más completa como este ejemplo:

Podemos ver que el objeto _id del campo autor ha sido sustituido por el modelo autor completo al que hace referencia.

De esta manera conseguimos un comportamiento parecido al típico relacional en las bases de datos SQL en MongoDB.

✎ ¿Ves alguna errata? ¿Quieres modificar algo? Haz una Pull Request.

Carlos Azaustre

Soy Carlos Azaustre. Me dedico al desarrollo web. Actualmente trabajo como Senior Frontend Engineer en Eventbrite. Fui nombrado en 2019 GDE (Google Developer Expert) en Tecnologías Web. Desde 2013 intento documentar en éste blog todo lo que aprendo y así compartirlo con el resto de la comunidad.

Si te gusta lo que lees, puedes apoyarme en mi Patreon o invitarme a un café virtual 🙂

Se mi patrón Invítame a un Café