00:00 / 00:00

Mongo Compass Aggregations

Arrancar con MongoDb es muy fácil, te lo instalas, tiras de terminal y empiezas a lanzar comandos y queries. Esto está muy bien mientras vayas generando consulta sencillas, en cuanto te metes con cosas más avanzadas como el aggregation framework ya cuesta un poco más ser productivo yendo a golpe de línea de comando.

Las consultas del aggregation framework suelen ser multilínea, están formadas por varias fases (stages), ... ¿qué problemas te puedes encontrar si tiras sólo de consola?

  • Es complicado copiar y pegar.
  • Es complicado ver que se genera en cada fase.
  • Es complicado reorganizar una consulta.

Para hacernos la vida más fácil el equipo de MongoDb, nos ofrece la herramienta oficial Mongo Compass, en esta serie vamos a ver cómo nos puede facilitar la vida cuando vayamos a construir consultas agregadas.

Manos a la obra

El framework de consultas agregadas que trae MongoDB nos permite romper una consulta compleja, en varios pasos, es como si se tratara de ir uniendo trozos de una tubería, éstas aceptan como entrada la salida del paso anterior, veamos un ejemplo sencillo:

  • Vamos a tirar de una base de datos de películas, los campos que nos interesa devolver en la consulta son:
    • El título de la película.
    • La puntuación que obtuvo.

¿Qué filtros queremos aplicar? Queremos la lista de películas que se estrenaron en 2010, y de estas, sacar las cinco primeras ordenadas alfabeticamente, y sólo mostrar título y puntuación.

Esto se podría hacer de la siguiente manera:

[
  {
    $match: {
      year: 2010,
    },
  },
  { $limit: 5 },
  {
    $sort: {
      title: 1,
    },
  },
  {
    $project: {
      title: 1,
      rating: "$imdb.rating",
    },
  },
];

¿Qué estamos haciendo aquí?

  • Primero nos quedamos con las películas de 2010.
  • Después le indicamos que sólo queremos quedarnos con las 5 primeras que se encuentren del resultado anterior.
  • Después le decimos que ese resultado lo ordene por título.
  • Para finalizar le decimos que sólo queremos mostrar en los resultados el título de la película y la puntuacion que le dieron (aquí aprovechamos y aplanamos el campo rating que venía como un objeto anidado en la base de datos).

Esta es una consulta sencilla, el aggregation framework permite generar consultas muy potentes, merece la pena emplear tiempo en aprender como funciona.

Si ejecutamos esto podemos ver el resultado, nos vamos al terminal:

Arrancamos el cli de mongo

mongo

Nos vamos a un base de datos que en mi caso he llamado mymovies

use mymovies

Lanzamos la consulta agregada:

db.movies.aggregate([
  {
    $match: {
      year: 2010,
    },
  },
  { $limit: 5 },
  {
    $sort: {
      title: 1,
    },
  },
  {
    $project: {
      title: 1,
      rating: "$imdb.rating",
    },
  },
]);

Bueno, esto nos da el resultado que esperabamos, pero no es muy manejable, ¿no hay alguna forma de crear estas consultas en las que tenga claro los pasos que estoy ejecutando, pueda ver resultados intermedios y de paso me de ayude a poder crearlas? Si, vamos a ver que tal se porta Mongo Compass.

Esta herramienta está disponible para Windows / Linux / Mac Os. Te puedes descargar Mongo Compass en este enlace

Aquí tenemos la herramienta, selecciono en el panel izquierdo la base de datos de myMovies y en concreto la colección movies

Panel izquierdo Mongo Compass elegir base de datos myMovies y coleccion Movies

Se me abre un panel a la derecha en el que puedo ver los detalle de myMovies elijo el tab aggregations y arrancamos con la fiesta :).

Lo primero que se nos muestra es la lista de documentos que tenemos en myMovies, y justo debajo tenemos una caja vacía, aquí es donde podemos empezar a añadir los pasos de nuestro pipeline, elegimos del combo de comandos, la opción $match y vemos como aparece una plantilla con los parametros que acepta, esta chuleta nos hace la vida un poco más fácil:

Añadiendo la stage $match

Hemos elegido $match y rellenamos el contenido con los siguiente

{
  year: 2010,
}

Filtramos por el año 2010.

Fíjate que nada más añadir el paso, podemos ver como a la derecha se muestra una preview de los resultados de esa fase.

Le damos al botón "Add Stage" y creamos el segundo paso, en este caso vamos a limitar el número de resultados a 5, elegimos $limit del combo, y añadimos el parámetro 5

Botón add stage Add stage limit

5
  • Vamos ahora a por la ordenación, misma operación que en el paso anterior Add stage y elegimos, la entrada $sort indicándole que ordene por el campo título.

Sort add stage

{
  title: 1,
},

Para finalizar vamos con la proyección, mismos pasos: Add Stage, elegimos $project

Project add stage

{
  title: 1,
  rating: "$imdb.rating",
},

Aquí le decimos que sólo queremos mostrar el campo título y el campo rating (en este caso hemos hecho una transformacíon, en el documento tenemos esta información en un objeto anidado y aquí lo queremos como un string plano).

Ahora podemos ver el resultado final.

resultado final de la query

De esta manera, crear consultas agregadas, se hace algo más fácil ya que podemos ir comprobando cada paso, y además obtenemos ayuda de la herramienta.

¿Con ganas de aprender Backend?

En Lemoncode impartimos un Bootcamp Backend Online, centrado en stack node y stack .net, en él encontrarás todos los recursos necesarios: clases de los mejores profesionales del sector, tutorías en cuanto las necesites y ejercicios para desarrollar lo aprendido en los distintos módulos. Si quieres saber más puedes pinchar aquí para más información sobre este Bootcamp Backend.