Creación y gestión de índices en Firestore para optimizar consultas

Clase 21 de 32Curso de Firebase 5 para Web

Resumen

Los índices en Firestore son clave para que las consultas sean rápidas y escalables. Al ordenar por varios campos o combinar filtros con ordenamientos, surge el mensaje de “requiere un índice”. Aquí entenderás por qué sucede, cómo resolverlo desde la consola y cómo escribir consultas con orderBy y where de forma eficiente.

¿Qué es un índice en Firestore y por qué acelera las consultas?

Un índice permite encontrar datos sin recorrer toda la colección. Piensa en la tabla de contenido de un libro: vas directo al tema sin leer cada página. Así, Firestore usa índices para ubicar registros exactos de forma rápida, impactando el rendimiento de tu aplicación.

  • Firestore crea índices de un solo campo automáticamente. Para cada campo genera orden ascendente y descendente, soportando búsquedas y tipos matriz.
  • Cuando combinas varios campos en filtros u ordenamientos, necesitas un índice compuesto.

¿Cuándo basta con índices automáticos?

  • Cuando ordenas por un único campo con orderBy en forma ascendente o descendente.
  • Cuando filtras u ordenas por un solo campo en consultas simples.

¿Cuándo necesitas un índice compuesto?

  • Cuando usas dos orderBy, por ejemplo: fecha ascendente y título ascendente.
  • Cuando mezclas where con orderBy, como autor ascendente y fecha ascendente.
  • Si cambias la dirección de uno de los campos (ejemplo: fecha ascendente y título descendente), se requiere otro índice diferente.
  • Si cambias el operador del filtro (por ejemplo, menor o igual), se construye un nuevo índice compuesto con esos campos.

¿Cómo crear el índice recomendado desde la consola?

Al fallar la consulta, Firestore muestra un enlace en el error. Al hacer clic, te lleva a la consola y sugiere exactamente el índice que falta: la colección, los campos y su dirección.

  • Verás la colección y la configuración propuesta, por ejemplo: fecha ascendente y título ascendente.
  • Haz clic en Crear índice y espera a que se habilite.
  • Una vez creado, las consultas vuelven a funcionar y se sienten más ágiles.

¿Qué pasa con direcciones diferentes (asc/desc)?

  • Cambiar una dirección implica un índice nuevo. Si antes usaste título ascendente y ahora necesitas título descendente con el mismo conjunto de campos, debes crear otro índice.

¿Cuánto tarda y cómo verificar?

  • El proceso toma unos segundos. Cuando el estado cambia a habilitado, actualiza la vista y verás los resultados ordenados correctamente.

¿Cómo escribir consultas con ordenamientos y filtros?

Escribe consultas claras y consistentes con los índices que tengas. Cuando el error indique “requiere un índice”, crea el recomendado por la consola.

Orden por un campo

import { collection, query, orderBy } from "firebase/firestore";

const q = query(
  collection(db, "posts"),
  orderBy("fecha", "asc")
);

Orden por dos campos (requiere índice compuesto)

import { collection, query, orderBy } from "firebase/firestore";

const q = query(
  collection(db, "posts"),
  orderBy("fecha", "asc"),
  orderBy("titulo", "asc")
);

Filtro por usuario y orden por fecha (requiere índice compuesto)

import { collection, query, where, orderBy } from "firebase/firestore";

const q = query(
  collection(db, "posts"),
  where("autor", "==", userId),
  orderBy("fecha", "asc")
);

Cambio de operador en el filtro (nuevo índice compuesto)

import { collection, query, where, orderBy } from "firebase/firestore";

const q = query(
  collection(db, "posts"),
  where("fecha", "<=", limiteFecha),
  orderBy("fecha", "asc")
);

En síntesis: usa orderBy para ordenar por fecha y título; combina where para autor o rangos de fecha; y crea índices compuestos cuando la consola lo sugiera. Los índices son esenciales para el rendimiento y garantizan respuestas rápidas incluso con datos crecientes.

¿Te quedó alguna duda sobre combinaciones de filtros y direcciones de ordenamiento en Firestore? Cuéntame tu caso en los comentarios y lo resolvemos juntos.