Lese og skrive Firestore-dokumenter
Legg til, les, oppdater og slett dokumenter i en Firestore-samling ved hjelp av Firestore-modulen, strukturer data med undersamlinger, og bruk sikkerhetsregler.
Lese og skrive Firestore-dokumenter er en gratis leksjon i React Native Academy på CoddyKit. Dette er leksjon 3 av 4. Du kan lese valgfritt 3 leksjoner fra denne læringsstien gratis i sin helhet – deretter låser CoddyKit PRO opp alle leksjoner, samt praktisk øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i React Native Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i React Native Academy inneholder totalt 4 leksjoner.
Firestore-datamodellen
Cloud Firestore er en NoSQL-dokumentdatabase. Data organiseres i samlinger (som mapper) som inneholder dokumenter (som JSON-filer). Hvert dokument har en unik ID og et sett med nøkkel-verdi-felter. Dokumenter kan inneholde undersamlinger for nøstede data.
En posts-samling kan for eksempel inneholde mange innleggsdokumenter, hvert med felter som title, content og userId. Et innleggsdokument kan ha en nøstet comments-undersamling for svarene. Denne modellen skalerer annerledes enn SQL — tenk først på tilgangsmønstrene, og modeller deretter dataene i samsvar med dem.
Hente en samlingsreferanse
Få tilgang til en Firestore-samling ved hjelp av firestore().collection('collection-name'). Dette returnerer en CollectionReference som De bruker til å lese dokumenter, legge til nye dokumenter eller lytte etter endringer. Samlingsreferanser er lette objekter og utløser ingen nettverkskall på egen hånd.
Hvis De vil referere til et bestemt dokument i en samling, kan De kjede på .doc('document-id'). Hvis De vil at Firestore skal generere en tilfeldig ID, utelater De argumentet når De oppretter et nytt dokument med .add().
import firestore from '@react-native-firebase/firestore';
// Reference to the 'posts' collection
const postsRef = firestore().collection('posts');
// Reference to a specific post document
const postRef = firestore().collection('posts').doc('post-id-123');
// Reference to a sub-collection
const commentsRef = firestore()
.collection('posts')
.doc('post-id-123')
.collection('comments');Legge til et dokument
Bruk .add(data) på en samlingsreferanse for å opprette et nytt dokument med en Firestore-generert ID. Bruk .doc(id).set(data) for å opprette eller overskrive et dokument med en bestemt ID.
Verktøyet firestore.FieldValue.serverTimestamp() angir et tidsstempel på serversiden, slik at alle klienter ser samme opprettelsestidspunkt uavhengig av forskjeller i enhetsklokkene. Bruk alltid servertidsstempler for feltene createdAt og updatedAt.
// Add with auto-generated ID
const newPost = await firestore().collection('posts').add({
title: 'Hello Firestore',
content: 'My first post!',
userId: auth().currentUser?.uid,
createdAt: firestore.FieldValue.serverTimestamp(),
});
console.log('New post ID:', newPost.id);
// Set with specific ID
await firestore().collection('users').doc(userId).set({
displayName: 'Alice',
email: 'alice@example.com',
createdAt: firestore.FieldValue.serverTimestamp(),
});Lese et enkelt dokument
Kall .get() på en DocumentReference for å hente dokumentet én gang. Resultatet er et DocumentSnapshot. Kontroller snapshot.exists før De leser dataene — hvis dokumentet aldri ble opprettet, er exists false, og snapshot.data() returnerer undefined.
Metoden snapshot.data() returnerer et vanlig JavaScript-objekt med alle feltene i dokumentet. Dokument-ID-en hentes via snapshot.id, ikke via dataobjektet.
async function getPost(postId: string) {
const snapshot = await firestore().collection('posts').doc(postId).get();
if (!snapshot.exists) {
console.log('Post not found');
return null;
}
const data = snapshot.data();
return { id: snapshot.id, ...data };
}Spørre mot en samling
Bruk .where(field, operator, value) til å filtrere dokumenter, .orderBy(field, 'desc') til å sortere og .limit(n) til å begrense resultatene. Kjed flere .where-kall for OG-logikk. Kall .get() for å utføre spørringen og motta et QuerySnapshot.
Iterer gjennom resultatene med snapshot.docs.map(doc => ({ id: doc.id, ...doc.data() })). Firestore krever sammensatte indekser for spørringer som filtrerer og sorterer etter ulike felter — Firestore skriver ut en lenke i loggene for å opprette den nødvendige indeksen hvis den mangler.
async function getUserPosts(userId: string) {
const snapshot = await firestore()
.collection('posts')
.where('userId', '==', userId)
.orderBy('createdAt', 'desc')
.limit(20)
.get();
return snapshot.docs.map((doc) => ({
id: doc.id,
...doc.data(),
}));
}Oppdatere et dokument
Bruk .update() til å endre bestemte felter uten å overskrive hele dokumentet. Bare feltene De angir, blir endret — alle andre felter forblir uendret. Dette skiller seg fra .set(), som som standard erstatter hele dokumentet.
Bruk firestore.FieldValue.increment(n) til å øke et numerisk felt atomisk uten å lese det først. Bruk firestore.FieldValue.arrayUnion(item) og arrayRemove(item) til å legge til eller fjerne elementer fra array-felter atomisk.
// Update specific fields
await firestore().collection('posts').doc(postId).update({
title: 'Updated Title',
updatedAt: firestore.FieldValue.serverTimestamp(),
});
// Atomic increment (e.g., a like counter)
await firestore().collection('posts').doc(postId).update({
likesCount: firestore.FieldValue.increment(1),
});
// Add a tag to an array without duplicates
await firestore().collection('posts').doc(postId).update({
tags: firestore.FieldValue.arrayUnion('react-native'),
});Slette et dokument
Kall .delete() på en DocumentReference for å fjerne dokumentet. Dette sletter bare selve dokumentet, ikke eventuelle undersamlinger det inneholder. For å slette undersamlinger må De slette hvert dokument i dem rekursivt — Firestore utfører ikke kaskadesletting automatisk.
Hvis De vil slette ett enkelt felt fra et dokument uten å slette selve dokumentet, bruker De firestore.FieldValue.delete() i et .update()-kall med feltnavnet som nøkkel.
// Delete a document
await firestore().collection('posts').doc(postId).delete();
// Delete a specific field within a document
await firestore().collection('users').doc(userId).update({
temporaryData: firestore.FieldValue.delete(),
});Batch-skriving
En batch-skriving lar Dem utføre flere opprettings-, oppdaterings- og sletteoperasjoner som én atomisk transaksjon. Enten lykkes alle operasjonene, eller så utføres ingen av dem. Dette er avgjørende for operasjoner som må være konsistente, for eksempel overføring av kreditter mellom brukere.
Opprett en batch med firestore().batch(), legg til operasjoner med batch.set(), batch.update() og batch.delete(), og bekreft deretter med batch.commit(). Batch-operasjoner støtter opptil 500 operasjoner om gangen.
const batch = firestore().batch();
// Create a post
const postRef = firestore().collection('posts').doc();
batch.set(postRef, { title: 'Batch Post', userId });
// Increment user post count
const userRef = firestore().collection('users').doc(userId);
batch.update(userRef, { postCount: firestore.FieldValue.increment(1) });
// Execute both operations atomically
await batch.commit();
console.log('Batch write complete');Firestore-sikkerhetsregler
Firestore-sikkerhetsregler styrer hvem som kan lese og skrive dokumenter. Reglene defineres i Firebase console under Firestore > Rules ved hjelp av et deklarativt DSL. request.auth-objektet gir Dem tilgang til den autentiserte brukerens UID i regeluttrykk.
Start alltid med deny all som standard, og tillat uttrykkelig bare det som er nødvendig. En regel som lar en bruker skrive bare til sitt eget brukerdokument, ser slik ut: allow write: if request.auth.uid == userId;
// firestore.rules
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
// Deny all by default
match /{document=**} {
allow read, write: if false;
}
// Users can read/write their own profile
match /users/{userId} {
allow read: if request.auth != null;
allow write: if request.auth.uid == userId;
}
// Posts are public to read, but only the author can write
match /posts/{postId} {
allow read: if true;
allow create: if request.auth != null;
allow update, delete: if request.auth.uid == resource.data.userId;
}
}
}Slå sammen data med set og merge
Som standard overskriver .set(data) hele dokumentet. Hvis De vil slå sammen nye data med eksisterende felter i stedet for å overskrive dem, sender De { merge: true } som det andre argumentet.
Dette er nyttig når De vil opprette et dokument hvis det ikke finnes, eller oppdatere det hvis det finnes — uten å kjenne alle feltene det inneholder. Det er et mer fleksibelt alternativ til .update(), som kaster en feil hvis dokumentet ikke finnes.
// set WITHOUT merge: overwrites the entire document
await firestore().collection('profiles').doc(userId).set({
displayName: 'Alice',
});
// Existing fields like 'bio' would be DELETED
// set WITH merge: only updates specified fields
await firestore().collection('profiles').doc(userId).set({
displayName: 'Alice',
}, { merge: true });
// Existing fields like 'bio' are preservedHåndtere frakoblede skrivninger
Firestore har en innebygd lokal hurtigbuffer og legger skrivninger i kø når enheten er frakoblet. Når tilkoblingen gjenopprettes, sender Firestore automatisk de kølagte skrivningene til serveren i riktig rekkefølge. Fra appens perspektiv lykkes skrivningene umiddelbart — brukergrensesnittet oppdateres uten å vente på serveren.
Dette betyr at React Native-appen kan være fullt funksjonell uten internettforbindelse for både lesing og skriving, mens Firestore håndterer synkroniseringen transparent. De kan registrere tilkoblingsstatusen ved hjelp av en NetInfo-lytter hvis De må vise tilkoblingsstatus i brukergrensesnittet.
// Firestore enables offline persistence by default on mobile.
// This write succeeds even without internet connection:
await firestore().collection('drafts').doc(draftId).set({
content: 'Work in progress...',
savedAt: firestore.FieldValue.serverTimestamp(),
});
// When connectivity returns, Firestore syncs automatically.
// No additional code required.Kort kontroll
Test forståelsen Deres av React Native Mobile Development-konseptene fra denne leksjonen.
Oppsummering av leksjonen
I denne leksjonen har De lært: Firestores dataformel med samlinger og dokumenter, hvordan De legger til, leser, oppdaterer og sletter dokumenter ved hjelp av React Native Firebase SDK, og hvordan batch-skrivninger sikrer atomiske operasjoner på flere dokumenter. Deretter skal vi legge til sanntidslyttere for å motta direkte Firestore-oppdateringer og konfigurere frakoblet lagring.
Lær deg JavaScript med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 30
- Leksjoner
- 120
Ofte stilte spørsmål
Er leksjonen «Lese og skrive Firestore-dokumenter» gratis?
Ja – du kan lese valgfritt 3 av leksjonene i læringsstien React Native Academy, inkludert «Lese og skrive Firestore-dokumenter», gratis i sin helhet her på nettet. Deretter låser CoddyKit PRO opp alle leksjoner, samt interaktiv øving med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Kurset i React Native Academy inneholder totalt 4 leksjoner.
Hva lærer jeg i «Lese og skrive Firestore-dokumenter»?
Legg til, les, oppdater og slett dokumenter i en Firestore-samling ved hjelp av Firestore-modulen, strukturer data med undersamlinger, og bruk sikkerhetsregler. Du øver på React Native Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med React Native Academy?
Ingen tidligere erfaring er nødvendig. React Native Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 3 av 4.
Hvor lang tid tar leksjonen «Lese og skrive Firestore-dokumenter»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne React Native Academy-leksjonen?
Ja. Alle React Native Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- Koble React Native Firebase til prosjektet
- E-post- og telefonautentisering med Firebase
- Lese og skrive Firestore-dokumenter
- Sanntidslyttere og frakoblet lagring