Introducción

En este tema, exploraremos las consultas avanzadas en Cloud Firestore. Firestore es una base de datos flexible y escalable para el desarrollo de aplicaciones móviles, web y de servidor. Las consultas avanzadas te permiten extraer datos de manera eficiente y específica, utilizando una variedad de filtros y combinaciones.

Conceptos Clave

  1. Consultas Compuestas: Permiten combinar múltiples condiciones en una sola consulta.
  2. Consultas de Rango: Utilizan operadores como >, <, >=, <= para filtrar documentos.
  3. Consultas de Igualdad: Filtran documentos que coinciden exactamente con un valor específico.
  4. Consultas de Matriz: Permiten buscar documentos que contienen ciertos elementos en un array.
  5. Ordenación y Limitación: Ordenan los resultados y limitan el número de documentos devueltos.
  6. Paginación: Permite dividir los resultados en páginas para una mejor gestión de grandes conjuntos de datos.

Consultas Compuestas

Las consultas compuestas permiten combinar múltiples condiciones en una sola consulta. Por ejemplo, puedes buscar documentos que cumplan con varias condiciones al mismo tiempo.

// Ejemplo de consulta compuesta
db.collection("usuarios")
  .where("edad", ">=", 18)
  .where("ciudad", "==", "Madrid")
  .get()
  .then((querySnapshot) => {
    querySnapshot.forEach((doc) => {
      console.log(doc.id, " => ", doc.data());
    });
  })
  .catch((error) => {
    console.log("Error getting documents: ", error);
  });

Explicación

  • db.collection("usuarios"): Selecciona la colección "usuarios".
  • .where("edad", ">=", 18): Filtra documentos donde la edad es mayor o igual a 18.
  • .where("ciudad", "==", "Madrid"): Filtra documentos donde la ciudad es "Madrid".
  • .get(): Ejecuta la consulta y devuelve los resultados.

Consultas de Rango

Las consultas de rango permiten filtrar documentos utilizando operadores de comparación.

// Ejemplo de consulta de rango
db.collection("productos")
  .where("precio", ">", 100)
  .where("precio", "<=", 500)
  .get()
  .then((querySnapshot) => {
    querySnapshot.forEach((doc) => {
      console.log(doc.id, " => ", doc.data());
    });
  })
  .catch((error) => {
    console.log("Error getting documents: ", error);
  });

Explicación

  • .where("precio", ">", 100): Filtra documentos donde el precio es mayor a 100.
  • .where("precio", "<=", 500): Filtra documentos donde el precio es menor o igual a 500.

Consultas de Igualdad

Las consultas de igualdad filtran documentos que coinciden exactamente con un valor específico.

// Ejemplo de consulta de igualdad
db.collection("usuarios")
  .where("nombre", "==", "Juan")
  .get()
  .then((querySnapshot) => {
    querySnapshot.forEach((doc) => {
      console.log(doc.id, " => ", doc.data());
    });
  })
  .catch((error) => {
    console.log("Error getting documents: ", error);
  });

Explicación

  • .where("nombre", "==", "Juan"): Filtra documentos donde el nombre es "Juan".

Consultas de Matriz

Las consultas de matriz permiten buscar documentos que contienen ciertos elementos en un array.

// Ejemplo de consulta de matriz
db.collection("eventos")
  .where("tags", "array-contains", "deporte")
  .get()
  .then((querySnapshot) => {
    querySnapshot.forEach((doc) => {
      console.log(doc.id, " => ", doc.data());
    });
  })
  .catch((error) => {
    console.log("Error getting documents: ", error);
  });

Explicación

  • .where("tags", "array-contains", "deporte"): Filtra documentos donde el array "tags" contiene el elemento "deporte".

Ordenación y Limitación

Puedes ordenar los resultados y limitar el número de documentos devueltos.

// Ejemplo de ordenación y limitación
db.collection("productos")
  .orderBy("precio", "desc")
  .limit(10)
  .get()
  .then((querySnapshot) => {
    querySnapshot.forEach((doc) => {
      console.log(doc.id, " => ", doc.data());
    });
  })
  .catch((error) => {
    console.log("Error getting documents: ", error);
  });

Explicación

  • .orderBy("precio", "desc"): Ordena los documentos por el campo "precio" en orden descendente.
  • .limit(10): Limita los resultados a los primeros 10 documentos.

Paginación

La paginación permite dividir los resultados en páginas para una mejor gestión de grandes conjuntos de datos.

// Ejemplo de paginación
let first = db.collection("productos")
  .orderBy("precio")
  .limit(10);

first.get().then((documentSnapshots) => {
  // Obtén el último documento
  let lastVisible = documentSnapshots.docs[documentSnapshots.docs.length-1];

  // Crea una nueva consulta empezando después del último documento
  let next = db.collection("productos")
    .orderBy("precio")
    .startAfter(lastVisible)
    .limit(10);

  next.get().then((querySnapshot) => {
    querySnapshot.forEach((doc) => {
      console.log(doc.id, " => ", doc.data());
    });
  });
});

Explicación

  • first: Primera consulta que obtiene los primeros 10 documentos.
  • lastVisible: Último documento de la primera consulta.
  • next: Nueva consulta que empieza después del último documento de la primera consulta.

Ejercicios Prácticos

Ejercicio 1: Consulta Compuesta

Objetivo: Crear una consulta que filtre usuarios mayores de 25 años que vivan en "Barcelona".

// Solución
db.collection("usuarios")
  .where("edad", ">", 25)
  .where("ciudad", "==", "Barcelona")
  .get()
  .then((querySnapshot) => {
    querySnapshot.forEach((doc) => {
      console.log(doc.id, " => ", doc.data());
    });
  })
  .catch((error) => {
    console.log("Error getting documents: ", error);
  });

Ejercicio 2: Consulta de Rango

Objetivo: Crear una consulta que filtre productos con un precio entre 50 y 200.

// Solución
db.collection("productos")
  .where("precio", ">=", 50)
  .where("precio", "<=", 200)
  .get()
  .then((querySnapshot) => {
    querySnapshot.forEach((doc) => {
      console.log(doc.id, " => ", doc.data());
    });
  })
  .catch((error) => {
    console.log("Error getting documents: ", error);
  });

Ejercicio 3: Consulta de Matriz

Objetivo: Crear una consulta que filtre eventos que tengan el tag "música".

// Solución
db.collection("eventos")
  .where("tags", "array-contains", "música")
  .get()
  .then((querySnapshot) => {
    querySnapshot.forEach((doc) => {
      console.log(doc.id, " => ", doc.data());
    });
  })
  .catch((error) => {
    console.log("Error getting documents: ", error);
  });

Conclusión

En esta sección, hemos explorado las consultas avanzadas en Cloud Firestore, incluyendo consultas compuestas, de rango, de igualdad, de matriz, así como técnicas de ordenación, limitación y paginación. Estas herramientas te permitirán extraer datos de manera eficiente y específica, mejorando la funcionalidad y el rendimiento de tus aplicaciones.

En el próximo módulo, profundizaremos en las reglas de seguridad de Firestore, asegurando que tus datos estén protegidos y accesibles solo para los usuarios autorizados.

Curso de Firebase

Módulo 1: Introducción a Firebase

Módulo 2: Autenticación de Firebase

Módulo 3: Base de datos en tiempo real de Firebase

Módulo 4: Cloud Firestore

Módulo 5: Almacenamiento de Firebase

Módulo 6: Mensajería en la nube de Firebase

Módulo 7: Análisis de Firebase

Módulo 8: Funciones de Firebase

Módulo 9: Monitoreo de rendimiento de Firebase

Módulo 10: Laboratorio de pruebas de Firebase

Módulo 11: Temas avanzados de Firebase

© Copyright 2024. Todos los derechos reservados