En aquest tema, explorarem les capacitats avançades de Cloud Firestore per realitzar consultes complexes. Aprendrem a utilitzar filtres, ordres, límits i altres tècniques per obtenir dades de manera eficient i precisa.
- Introducció a les consultes avançades
Cloud Firestore permet realitzar consultes avançades que poden incloure múltiples condicions, ordres i límits. Aquestes consultes són molt útils per obtenir dades específiques d'una col·lecció gran.
1.1. Filtres compostos
Els filtres compostos permeten combinar múltiples condicions en una sola consulta. Per exemple, podem obtenir documents que compleixin més d'una condició.
// Obtenir documents on el camp 'age' sigui major de 18 i el camp 'status' sigui 'active' db.collection("users") .where("age", ">", 18) .where("status", "==", "active") .get() .then((querySnapshot) => { querySnapshot.forEach((doc) => { console.log(doc.id, " => ", doc.data()); }); });
1.2. Ordre de resultats
Podem ordenar els resultats d'una consulta utilitzant el mètode orderBy
. És possible ordenar per múltiples camps.
// Obtenir documents ordenats per 'age' en ordre ascendent db.collection("users") .orderBy("age") .get() .then((querySnapshot) => { querySnapshot.forEach((doc) => { console.log(doc.id, " => ", doc.data()); }); });
1.3. Límits i desplaçaments
Els límits i desplaçaments són útils per paginar resultats. El mètode limit
especifica el nombre màxim de documents que es retornaran, mentre que startAfter
i endBefore
permeten desplaçar-se pels resultats.
// Obtenir els primers 10 documents db.collection("users") .orderBy("age") .limit(10) .get() .then((querySnapshot) => { querySnapshot.forEach((doc) => { console.log(doc.id, " => ", doc.data()); }); });
- Consultes amb múltiples condicions
2.1. Consultes amb múltiples where
Podem combinar múltiples condicions where
per refinar les nostres consultes.
// Obtenir documents on 'age' sigui major de 18 i 'city' sigui 'Barcelona' db.collection("users") .where("age", ">", 18) .where("city", "==", "Barcelona") .get() .then((querySnapshot) => { querySnapshot.forEach((doc) => { console.log(doc.id, " => ", doc.data()); }); });
2.2. Consultes amb in
i array-contains
Firestore permet utilitzar operadors com in
i array-contains
per realitzar consultes més complexes.
// Obtenir documents on 'status' sigui 'active' o 'pending' db.collection("users") .where("status", "in", ["active", "pending"]) .get() .then((querySnapshot) => { querySnapshot.forEach((doc) => { console.log(doc.id, " => ", doc.data()); }); }); // Obtenir documents on el camp 'tags' contingui 'developer' db.collection("users") .where("tags", "array-contains", "developer") .get() .then((querySnapshot) => { querySnapshot.forEach((doc) => { console.log(doc.id, " => ", doc.data()); }); });
- Consultes amb ordres múltiples
Podem ordenar els resultats per múltiples camps utilitzant orderBy
.
// Obtenir documents ordenats per 'age' en ordre ascendent i per 'name' en ordre descendent db.collection("users") .orderBy("age") .orderBy("name", "desc") .get() .then((querySnapshot) => { querySnapshot.forEach((doc) => { console.log(doc.id, " => ", doc.data()); }); });
- Paginació de resultats
La paginació és essencial per gestionar grans volums de dades. Utilitzarem startAfter
per obtenir la següent pàgina de resultats.
let lastVisible; // Obtenir els primers 10 documents db.collection("users") .orderBy("age") .limit(10) .get() .then((querySnapshot) => { lastVisible = querySnapshot.docs[querySnapshot.docs.length - 1]; querySnapshot.forEach((doc) => { console.log(doc.id, " => ", doc.data()); }); }); // Obtenir els següents 10 documents db.collection("users") .orderBy("age") .startAfter(lastVisible) .limit(10) .get() .then((querySnapshot) => { querySnapshot.forEach((doc) => { console.log(doc.id, " => ", doc.data()); }); });
Exercicis pràctics
Exercici 1: Consulta amb múltiples condicions
Crea una consulta que obtingui tots els usuaris que tinguin més de 25 anys i visquin a "Madrid".
Exercici 2: Consulta amb array-contains
Crea una consulta que obtingui tots els usuaris que tinguin "designer" en el camp tags
.
Exercici 3: Paginació
Implementa una funció que obtingui els usuaris en pàgines de 5 documents cada una, ordenats per age
.
Solucions
Solució 1
db.collection("users") .where("age", ">", 25) .where("city", "==", "Madrid") .get() .then((querySnapshot) => { querySnapshot.forEach((doc) => { console.log(doc.id, " => ", doc.data()); }); });
Solució 2
db.collection("users") .where("tags", "array-contains", "designer") .get() .then((querySnapshot) => { querySnapshot.forEach((doc) => { console.log(doc.id, " => ", doc.data()); }); });
Solució 3
let lastVisible; function getNextPage() { let query = db.collection("users").orderBy("age").limit(5); if (lastVisible) { query = query.startAfter(lastVisible); } query.get().then((querySnapshot) => { if (!querySnapshot.empty) { lastVisible = querySnapshot.docs[querySnapshot.docs.length - 1]; querySnapshot.forEach((doc) => { console.log(doc.id, " => ", doc.data()); }); } else { console.log("No more documents!"); } }); } // Obtenir la primera pàgina getNextPage(); // Obtenir la següent pàgina (crida aquesta funció quan sigui necessari) getNextPage();
Conclusió
En aquest tema, hem après a realitzar consultes avançades amb Cloud Firestore, utilitzant filtres compostos, ordres, límits i paginació. Aquestes tècniques ens permeten obtenir dades de manera més eficient i precisa, adaptant-se a les necessitats específiques de les nostres aplicacions. En el següent tema, explorarem les regles de seguretat per protegir les nostres dades a Firestore.
Curs de Firebase
Mòdul 1: Introducció a Firebase
Mòdul 2: Autenticació de Firebase
- Introducció a l'autenticació de Firebase
- Autenticació amb correu electrònic i contrasenya
- Autenticació amb xarxes socials
- Gestió d'usuaris
Mòdul 3: Base de dades en temps real de Firebase
- Introducció a la base de dades en temps real
- Lectura i escriptura de dades
- Estructura de dades i regles de seguretat
- Capacitats fora de línia
Mòdul 4: Cloud Firestore
- Introducció a Cloud Firestore
- Model de dades de Firestore
- Operacions CRUD
- Consultes avançades
- Regles de seguretat
Mòdul 5: Emmagatzematge de Firebase
- Introducció a l'emmagatzematge de Firebase
- Carregar fitxers
- Descarregar fitxers
- Metadades de fitxers i seguretat
Mòdul 6: Missatgeria en el núvol de Firebase
- Introducció a la missatgeria en el núvol
- Enviar notificacions
- Gestionar notificacions
- Funcions avançades de missatgeria
Mòdul 7: Analítica de Firebase
Mòdul 8: Funcions de Firebase
Mòdul 9: Monitoratge del rendiment de Firebase
- Introducció al monitoratge del rendiment
- Configuració del monitoratge del rendiment
- Analitzar dades de rendiment