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
- Consultas Compuestas: Permiten combinar múltiples condiciones en una sola consulta.
- Consultas de Rango: Utilizan operadores como
>
,<
,>=
,<=
para filtrar documentos. - Consultas de Igualdad: Filtran documentos que coinciden exactamente con un valor específico.
- Consultas de Matriz: Permiten buscar documentos que contienen ciertos elementos en un array.
- Ordenación y Limitación: Ordenan los resultados y limitan el número de documentos devueltos.
- 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
- Introducción a la autenticación de Firebase
- Autenticación por correo electrónico y contraseña
- Autenticación de redes sociales
- Gestión de usuarios
Módulo 3: Base de datos en tiempo real de Firebase
- Introducción a la base de datos en tiempo real
- Lectura y escritura de datos
- Estructura de datos y reglas de seguridad
- Capacidades sin conexión
Módulo 4: Cloud Firestore
- Introducción a Cloud Firestore
- Modelo de datos de Firestore
- Operaciones CRUD
- Consultas avanzadas
- Reglas de seguridad
Módulo 5: Almacenamiento de Firebase
- Introducción al almacenamiento de Firebase
- Subida de archivos
- Descarga de archivos
- Metadatos de archivos y seguridad
Módulo 6: Mensajería en la nube de Firebase
- Introducción a la mensajería en la nube
- Envío de notificaciones
- Manejo de notificaciones
- Características avanzadas de mensajería
Módulo 7: Análisis de Firebase
Módulo 8: Funciones de Firebase
- Introducción a las funciones de Firebase
- Escritura de funciones
- Despliegue de funciones
- Activación de funciones
Módulo 9: Monitoreo de rendimiento de Firebase
- Introducción al monitoreo de rendimiento
- Configuración del monitoreo de rendimiento
- Análisis de datos de rendimiento
Módulo 10: Laboratorio de pruebas de Firebase
- Introducción al laboratorio de pruebas de Firebase
- Ejecución de pruebas
- Análisis de resultados de pruebas