Hopp til innhold
Fagartikkel

Lese data fra Cloud Firestore

Når vi skal hente data fra Cloud Firestore, kan vi hente ut ett enkelt dokument eller alle dokumentene i ei samling. Vi kan også bruke spørringer for å hente utvalgte dokumenter som oppfyller en eller flere betingelser.

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:

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

Hente ett dokument med getDoc()
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:

Console
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:

Hente ut enkeltdata fra dokumentet
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:

Hente flere dokumenter med getDocs()
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:

Console
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:

Spørring
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:

Spørring
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:

Hente utvalgte dokumenter med query()
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:

Console
1Isa Mo isamo@mo.no
2Jakob Nilsen jakob@nilsen.net

Relatert innhold

Fagstoff
Oppsett av Firebase og Cloud Firestore

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

Fagstoff
Skrive data til 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.