Lese data fra Cloud Firestore

I artikkelen "Skrive data til Cloud Firestore" lærte du hvordan du legger inn data i databasen. I denne artikkelen skal du lære hvordan du henter data ut fra databasen og lager spørringer for å velge hvilke data du vil hente ut.
I denne leksjonen skal du bruke følgende Firebase-funksjoner:
collection, doc, addDoc, setDoc, getDoc, getDocs, query, where, orderBy
Pass på å importere disse fra (...)/firebase-firestore.js i koden din (lim inn linja over etter import { getFirestore, i koden din).
For at du skal kunne ha data å jobbe med, kan du kopiere koden under til skriptet ditt for å legge inn fire elever i databasen din:
1//Importerer Firebase-funksjonene vi trenger 2import { setDoc, doc } from "https://www.gstatic.com/firebasejs/9.6.3/firebase-firestore.js"; 3 4//Legger inn fire elever i databasen 5await setDoc( 6 doc(db, "elever", "thore"), { 7 fornavn: "Rebecca", 8 etternavn: "Thomasen", 9 telefon: "12345678" 10}); 11await setDoc( 12 doc(db, "elever", "nilja"), { 13 fornavn: "Jakob", 14 etternavn: "Nilsen", 15 epost: "jakob@nilsen.net" 16}); 17await setDoc( 18 doc(db, "elever", "moisa"), { 19 fornavn: "Isa", 20 etternavn: "Mo", 21 epost: "isamo@mo.no", 22 telefon: "23456789" 23}); 24await setDoc( 25 doc(db, "elever", "marga"), { 26 fornavn: "Gabrielle", 27 etternavn: "Martin", 28 telefon: "45678901" 29});
Lese data fra databasen
I likhet med at det finnes flere måter å skrive data til databasen på, finnes det også flere måter å lese fra databasen på. De enkleste er getDoc() og getDocs().
Hente ut ett dokument fra databasen med getDoc()
getDoc() brukes til å hente ut enkeltdokumenter fra databasen og krever at du vet ID-en til dokumentet du skal hente. I likhet med setDoc() bruker getDoc() funksjonen doc() for å angi hvilket dokument som skal hentes ut. getDoc() returnerer et databaseobjekt, og derfor må du opprette en variabel for å lagre dataene som hentes ut.
Koden for å hente ut dokumentet vi lagde for eleven Jakob Nilsen, blir som under.
1// import { getDoc, doc } from "https://www.gstatic.com/firebasejs/9.6.3/firebase-firestore.js"; 2 3const docSnap = await getDoc( 4 doc(db, "elever", "nilja") 5); 6console.log( 7 "Document data:", 8 docSnap.data() 9);
Merk at vi skriver await foran getDoc() for å sørge for at neste linje i koden ikke kjøres før kommunikasjonen med databasen er ferdig.
Resultatet blir skrevet ut slik i konsollen:
1Document data: 2>{fornavn: 'Jakob', etternavn: 'Nilsen', epost: 'jakob@nilsen.net'}

Når vi henter ut data fra databasen, kaller vi det vi henter ut et "snapshot", for det representerer et øyeblikksbilde av dataene i det øyeblikket vi henter dem ut fra databasen. const docSnap i koden over representerer et øyeblikksbilde av ett dokument i databasen (docSnap er her bare et variabelnavn og kan i utgangspunktet være hva som helst, men dette er et eksempel på et beskrivende variabelnavn). docSnap.data() henter ut alle dataene som er lagret i dokumentet og presenterer dem som et objekt. Om du vil hente ut enkeltdata, kan du angi det slik:
1console.log( 2 "ID:", 3 docSnap.id, 4 "Navn:", 5 docSnap.data().fornavn, 6 docSnap.data().etternavn 7);
Prøv å lime inn disse to linjene i koden din og se hva som blir skrevet ut i konsollen.
Hente ut alle dokumentene i ei samling med getDocs()
getDocs() brukes for å hente ut flere dokumenter på en gang fra databasen. Det kan være enten alle dokumentene i ei samling eller et utvalg basert på gitte kriterier (query). getDocs() returnerer ei liste (array) med databaseobjekter.
For å hente ut alle dokumentene i ei samling bruker vi collection() inne i getDocs() for å angi hvilken samling vi skal hente dokumentene fra. For å hente ut alle dokumentene i elevlista blir koden slik:
1// import { getDocs, collection } from "https://www.gstatic.com/firebasejs/9.6.3/firebase-firestore.js"; 2 3const snapshot = await getDocs( 4 collection(db, "elever") 5); 6 7snapshot.forEach((docSnap) => { 8 console.log( 9 docSnap.data().fornavn, 10 docSnap.data().etternavn 11 ); 12});

snapshot.forEach() er ei løkke som kjører en gang for hvert dokument (docSnap) i samlinga. I eksempelet skriver denne løkka ut fornavn og etternavn til alle elevene til konsollen:
1Gabrielle Martin 2Isa Mo 3Jakob Nilsen 4Rebecca Thomasen
Hente ut utvalgte dokumenter i ei samling med query()
Med query() kan vi lage spørringer mot databasen. En spørring er en betingelse for å filtrere, begrense eller sortere dataene som skrives ut. Dette fungerer i utgangspunktet på samme måte som i SQL. For eksempel kan vi hente ut bare elever som er registrert med e-post, eller vi kunne ha hentet ut bare elever som har matematikk som et av sine fag. For å lage en spørring kan vi bruke funksjonene where(), orderBy(), startAt(), startAfter(), endAt(), limit() eller limitToLast().
For eksempel kan vi lage en spørring for å hente ut alle elever, sortert på etternavn:
1// import { collection, query, orderBy } from "https://www.gstatic.com/firebasejs/9.6.3/firebase-firestore.js"; 2 3query( 4 collection(db, "elever"), 5 orderBy("etternavn") 6); 7
Vi kan også lage en spørring for å bare hente ut elever som er registrert med e-post:
1// import { collection, query, where } from "https://www.gstatic.com/firebasejs/9.6.3/firebase-firestore.js"; 2 3query( 4 collection(db, "elever"), 5 where("epost", "!=", "undefined") 6);
Betingelsen where("epost", "!=", "undefined") betyr at e-post skal være ikke lik (!=) "undefined". Det vil si at spørringen utelukker elever som ikke har registrert e-post (epost == undefined).
Vi skal nå bruke denne spørringen opp mot databasen og skrive ut resultatet:
1// import { getDocs, collection, query, where } from "https://www.gstatic.com/firebasejs/9.6.3/firebase-firestore.js"; 2 3const querySnapshot = await getDocs( 4 query( 5 collection(db, "elever"), 6 where("epost", "!=", "undefined") 7 ) 8); 9 10// Går gjennom alle dokumenter returnert av spørringen 11querySnapshot.forEach((docSnap) => { 12 // Skriver ut data fra hvert av dokumentene til konsollen 13 console.log( 14 docSnap.data().fornavn, 15 docSnap.data().etternavn, 16 docSnap.data().epost 17 ); 18});

querySnapshot.forEach() skriver ut alle resultatene av spørringen i konsollen:
1Isa Mo isamo@mo.no 2Jakob Nilsen jakob@nilsen.net
Relatert innhold
I denne guiden vil du lære et basisoppsett som du skal bruke videre i modulen "Lage en dynamisk webside med databasekobling i Firebase Cloud Firestore".
I NoSQL-databaser organiseres data i samlinger og dokumenter. I denne artikkelen skal du lære to metoder for å opprette dokumenter i Cloud Firestore.