Hopp til innhald
Fagartikkel

Lese data frå Cloud Firestore

Når vi skal hente data frå Cloud Firestore, kan vi hente ut eitt enkelt dokument eller alle dokumenta i ei samling. Vi kan òg bruke spørjingar for å hente utvalde dokument som oppfyller eit eller fleire vilkår.

I artikkelen "Skrive data til Cloud Firestore" lærte du korleis du legg inn data i databasen. I denne artikkelen skal du lære korleis du hentar data ut frå databasen og lagar spørjingar for å velje kva data du vil hente ut.

I denne leksjonen skal du bruke desse Firebase-funksjonane:

collection, doc, addDoc, setDoc, getDoc, getDocs, query, where, orderBy

Pass på å importere desse frå (...)/firebase-base-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 elevar i databasen din:

Eksempelkode
1//Importerer Firebase-funksjonane vi treng
2import { setDoc, doc } from "https://www.gstatic.com/firebasejs/9.6.3/firebase-firestore.js";
3
4//Legg inn fire elevar i databasen
5await setDoc(
6  doc(db, "elevar", "thore"), {
7    fornamn: "Rebecca",
8    etternamn: "Thomasen",
9    telefon: "12345678"
10});
11await setDoc(
12  doc(db, "elevar", "nilja"), {
13    fornamn: "Jakob",
14    etternamn: "Nilsen",
15    epost: "jakob@nilsen.net"
16});
17await setDoc(
18  doc(db, "elevar", "moisa"), {
19    fornamn: "Isa",
20    etternamn: "Mo",
21    epost: "isamo@mo.no",
22    telefon: "23456789"
23});
24await setDoc(
25  doc(db, "elevar", "marga"), {
26    fornamn: "Gabrielle",
27    etternamn: "Martin",
28    telefon: "45678901"
29});

Lese data frå databasen

På same vis som at det finst fleire måtar å skrive data til databasen på, finst det òg fleire måtar å lese frå databasen på. Dei enklaste er getDoc() og getDocs().

Hente ut eitt dokument frå databasen med getDoc()

getDoc() blir brukt til å hente ut enkeltdokument frå databasen og krev at du veit ID-en til dokumentet du skal hente. Til liks med setDoc() bruker getDoc() funksjonen doc() for å angi kva dokument som skal hentast ut. getDoc() returnerer eit databaseobjekt, og derfor må du opprette ein variabel for å lagre dataa som blir henta ut.

Koden for å hente ut dokumentet vi laga for eleven Jakob Nilsen, blir som under.

Hente eitt 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, "elevar", "nilja")
5);
6console.log(
7  "Document data:", 
8  docSnap.data()
9);

Merk at vi skriv await framfor getDoc() for å sørgje for at neste linje i koden ikkje blir køyrd før kommunikasjonen med databasen er ferdig.

Resultatet blir skrive ut slik i konsollen:

Console
1Document data:
2>{fornamn: 'Jakob', etternamn: 'Nilsen', epost: 'jakob@nilsen.net'}

Når vi hentar ut data frå databasen, kallar vi det vi hentar ut eit "snapshot", for det representerer eit augneblinksbilete av dataa i den augneblinken vi hentar dei ut frå databasen. const docSnap i koden over representerer eit augneblinksbilete av eitt dokument i databasen (docSnap er her berre eit variabelnamn og kan i utgangspunktet vere kva som helst, men dette er eit døme på eit beskrivande variabelnamn). docSnap.data() hentar ut alle dataa som er lagra i dokumentet og presenterer dei som eit objekt. Om du vil hente ut enkeltdata, kan du skrive det slik:

Hente ut enkeltdata frå dokumentet
1console.log(
2  "ID:", 
3  docSnap.id,
4  "Navn:", 
5  docSnap.data().fornamn, 
6  docSnap.data().etternamn
7); 

Prøv å lime inn desse to linjene i koden din og sjå kva som blir skrive ut i konsollen.

Hente ut alle dokumenta i ei samling med getDocs()

getDocs() blir brukt for å hente ut fleire dokument på ein gong frå databasen. Det kan vere anten alle dokumenta i ei samling eller eit utval basert på gitte kriterium (query). getDocs() returnerer ei liste (array) med databaseobjekt.

For å hente ut alle dokumenta i ei samling bruker vi collection() inne i getDocs() for å angi kva samling vi skal hente dokumenta frå. For å hente ut alle dokumenta i elevlista blir koden slik:

Hente fleire dokument 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, "elevar")
5);
6
7snapshot.forEach((docSnap) => {
8  console.log(
9    docSnap.data().fornamn, 
10    docSnap.data().etternamn
11  );
12}); 

snapshot.forEach() er ei lykkje som køyrer ein gong for kvart dokument (docSnap) i samlinga. I dømet skriv denne lykkja ut fornamn og etternamn til alle elevane til konsollen:

Console
1Gabrielle Martin
2Isa Mo
3Jakob Nilsen
4Rebecca Thomasen

Hente ut utvalde dokument i ei samling med query()

Med query() kan vi lage spørjingar mot databasen. Ei spørjing er eit vilkår for å filtrere, avgrense eller sortere dataa som blir skrivne ut. Dette fungerer i utgangspunktet på same måte som i SQL. Til dømes kan vi hente ut berre elevar som er registrerte med e-post, eller vi kunne ha henta ut berre elevar som har matematikk som eit av faga sine. For å lage ei spørjing kan vi bruke funksjonane where(), orderBy(), startAt(), startAfter(), endAt(), limit() eller limitToLast().

Til dømes kan vi lage ei spørjing for å hente ut alle elevar, sortert på etternamn:

Spørjing
1// import { collection, query, orderBy } from "https://www.gstatic.com/firebasejs/9.6.3/firebase-firestore.js";
2
3query(
4  collection(db, "elevar"), 
5  orderBy("etternamn")
6);
7

Vi kan òg lage ei spørjing for å berre hente ut elevar som er registrerte med e-post:

Spørjing
1// import { collection, query, where } from "https://www.gstatic.com/firebasejs/9.6.3/firebase-firestore.js";
2
3query(
4  collection(db, "elevar"), 
5  where("epost", "!=", "undefined")
6);

Vilkåret where("e-post", "!=", "undefined") betyr at e-post skal vere ikkje lik (!=) "undefined". Det vil seie at spørjinga ser bort frå elevar som ikkje har registrert e-post (e-post == undefined).

Vi skal no bruke denne spørjinga opp mot databasen og skrive ut resultatet:

Hente utvalde dokument 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, "elevar"), 
6    where("epost", "!=", "undefined")
7  )
8);
9
10// Går gjennom alle dokument returnert av spørjinga
11querySnapshot.forEach((docSnap) => {
12  // Skriv ut data frå kvart av dokumenta til konsollen
13  console.log(
14    docSnap.data().fornamn, 
15    docSnap.data().etternamn, 
16    docSnap.data().epost
17  );
18});

querySnapshot.forEach() skriv ut alle resultata av spørjinga i konsollen:

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

Relatert innhald

Fagstoff
Oppsett av Firebase og Cloud Firestore

I denne guiden vil du lære eit basisoppsett som du skal bruke vidare i modulen "Lage ei dynamisk webside med databasekopling i Firebase Cloud Firestore".

Fagstoff
Skrive data til Cloud Firestore

I NoSQL-databasar blir data organiserte i samlingar og dokument. I denne artikkelen skal du lære to metodar for å opprette dokument i Cloud Firestore.