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.

  1. 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());
    });
  });

  1. 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());
    });
  });

  1. 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());
    });
  });

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

Mòdul 3: Base de dades en temps real de Firebase

Mòdul 4: Cloud Firestore

Mòdul 5: Emmagatzematge de Firebase

Mòdul 6: Missatgeria en el núvol de Firebase

Mòdul 7: Analítica de Firebase

Mòdul 8: Funcions de Firebase

Mòdul 9: Monitoratge del rendiment de Firebase

Mòdul 10: Laboratori de proves de Firebase

Mòdul 11: Temes avançats de Firebase

© Copyright 2024. Tots els drets reservats