Fecha publicación: 12 jul 2021

MongoDb índices: múltiples campos II

Los índices compuestos son muy potentes, y bien configurados nos pueden servir para poder cubrir más de un caso.

Manos a la obra

Vamos a seguir con la colección de películas, borramos los índices de la colección movies para asegurarnos que partimos de cero:

db.movies.dropIndexes();

Queremos lanzar una consulta en la que filtremos por year (año de estreno de la película), y runtime (duración de la película), y ordenar esto por título.

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

Para que la consulta vaya como un tiro creamos un índice compuesto:

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

Si probamos podemos ver que va todo genial:

  • Se usa el índice para filtrar.
  • Se usa el índice para ordenar.

Pero... buf, crear un índice para un sólo caso es un poco rollo ¿No se puede aprovechar esto en más casos? La respuesta es sí, fíjate que este índice se puede reaprovechar en las siguientes consultas:

  • Filtrando sólo por año.
db.movies.find({ year: 2010 });

filtrando por año y tirando del índice compuesto

  • Filtrando por año y duración de película (sin ordenar por título)
db.movies.find({ year: 2010, runtime: 180 });

filtrando por año y runtime pero sin ordenar

¿Y si quiero filtrar sólo por runtime? Para eso, ya no te valdría porque el punto de entrada de este índice es el campo year y el orden de los campos van de izquierda a derecha, el campo runtime está en medio, no tiene forma de llegar el índice a él sin pasar antes por year.

Para ello podríamos crea el índice pero empezando por runtime:

db.movies.createIndex({ runtime: 1, year: 1, title: 1 });
db.movies.find({ runtime: 180 }).sortBy({ title: 1 });

por runtime ya no puede aprovechar el índice

Volvamos al caso anterior en el que filtrábamos por runtime y year ¿qué pasa si en la consulta bailo el orden de los parámetros?, por ejemplo

db.movies.find({ runtime: 180, year: 2010 });

En vez de year y runtime tal y como está en el índice.

El índice se sigue aplicando, el amigo planificador de consultas es muy listo y se encarga de reordenar los parámetros por nosotros.

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