MongoDb índices: Ordenación

Otra área muy importante en la que los índices nos pueden ser de gran ayuda es en la de la ordenación de resultados.

Manos a la obra

Es muy normal, que tu quieras ordenar los resultados de una búsqueda por uno o varios campos, esto lo haces utilizando el comando sort, ¿qué es lo que hace por defecto MongoDb? Montar la ordenación en memoria, con lo que imagínate que puede pasar si intentas ordenar una colección bien grande.

Vamos a suponer que queremos ordenar las películas por su título, lancemos la siguiente consulta desde el explain tab de mongo compass (si eres más de usar el terminal no te olvides de añadir explain() al final de la misma):

db.movies.find({}).sortBy({ title: 1 });

¿Qué esta pasando aquí? Al no haber ningún índice asociado al campo título, se realiza la ordenación en memoria.

Sort en memoria

Vamos a crear un índice por título:

db.movies.createIndex({ title: 1 });

Y volvemos a lanzar la consulta: ahora podemos comprobar que la ordenación ya no se hace en memoria, la obtenemos directamente tirando del índice.

sortindex.png

Sort en memoria

_Vale el índice es ascendente, _¿y si resulta que lo quiero descendente?_ ¿tengo que crear otro? No... fíjate que listo es mongo que lo recorre al revés :)

db.movies.find({}).sortBy({ title: -1 });

¿Y qué pasa si quiero filtrar por año 2010 y ordenar por título? En este caso MongoDb decide utilizar el índice por año y realiza la ordenación en memoria

db.movies.find({ year: 2010 }).sortBy({ title: 1 });

Si por ejempo quisiera encontrar las películas que se estrenaron a partir de 1970:

db.movies.find({ year: { $gte: 1970 } }).sortBy({ title: 1 });

¿Y quien es el listo que ha decidido que es más óptimo usar ese índice? MongoDb tiene un planificador de consultas (query planner) que se encarga de ver cuales son las mejores opciones antes de lanzar la ejecución de la consulta.

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