Lese data frå Cloud Firestore

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:
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.
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:
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:
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:
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:
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:
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:
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:
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:
1Isa Mo isamo@mo.no 2Jakob Nilsen jakob@nilsen.net
Relatert innhald
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".
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.