Questa guida rapida mostra come configurare Cloud Firestore, aggiungere dati e poi utilizzare le operazioni di base o le operazioni della pipeline per eseguire query sui dati appena aggiunti nella console Firebase.
Crea un database Cloud Firestore
- Se non l'hai ancora fatto, crea un progetto Firebase: nella console Firebase, fai clic su Aggiungi progetto, poi segui le istruzioni sullo schermo per creare un progetto Firebase o per aggiungere i servizi Firebase a un progetto Google Cloud esistente.
Apri il progetto nella console Firebase. Nel riquadro a sinistra, espandi Build e poi seleziona Database Firestore.
Fai clic su Crea database.
Seleziona Enterprise per la modalità database.
Seleziona Firestore in modalità nativa per la modalità di funzionamento, che supporta le operazioni Core e Pipeline.
Seleziona una posizione per il tuo database.
Seleziona una modalità iniziale per Cloud Firestore Security Rules:
- Modalità di test
Ideale per iniziare a utilizzare le librerie client web e mobile, ma consente a chiunque di leggere e sovrascrivere i tuoi dati. Dopo il test, assicurati di esaminare la sezione Proteggere i dati.
Per iniziare a utilizzare l'SDK per il web, le piattaforme Apple o Android, seleziona la modalità di test.
- Modalità di produzione
Nega tutte le operazioni di lettura e scrittura dei client web e su dispositivi mobili. I tuoi server delle applicazioni autenticati (Python) possono comunque accedere al tuo database.
Il set iniziale di Cloud Firestore Security Rules verrà applicato al database Cloud Firestore predefinito. Se crei più database per il tuo progetto, puoi eseguire il deployment di Cloud Firestore Security Rules per ogni database.
Fai clic su Crea.
Quando abiliti Cloud Firestore, viene abilitata anche l'API in Cloud API Manager.
Configurazione dell'ambiente di sviluppo
Aggiungi le dipendenze e le librerie client necessarie alla tua app.
Web
- Segui le istruzioni per aggiungere Firebase alla tua app web.
-
L'SDK Cloud Firestore per l'anteprima privata è disponibile come pacchetto npm.
Utilizza il seguente comando per installare l'SDK Firestore nel tuo progetto npm.
npm install --save firebase@eap-firestore-pipelines
iOS+
- Segui le istruzioni per aggiungere Firebase alla tua app per iOS.
- Clona l'SDK Firebase da GitHub ed estrai il branch delle pipeline. Prendi nota della posizione in cui lo cloni, perché ti servirà nel passaggio successivo:
git clone https://github.com/firebase/firebase-ios-sdk.git # or git clone git@github.com:firebase/firebase-ios-sdk.git cd firebase-ios-sdk # check out pipeline feature branch git fetch origin feat/pipeline/private-preview git checkout feat/pipeline/private-preview
- Quindi aggiungi la directory (firebase-ios-sdk) come dipendenza locale al tuo
progetto Xcode:
- Nel menu File, scegli Aggiungi dipendenze del pacchetto.
- Fai clic sul pulsante Aggiungi locale…, quindi individua la directory firebase-ios-sdk con il ramo della funzionalità che hai estratto.
Android
- Segui le istruzioni per aggiungere Firebase alla tua app Android.
- Clona l'SDK Firebase da GitHub, estrai il ramo delle pipeline e
pubblicalo in Maven locale:
# Prerequisites before you start: # Install Java 17 # Setup Android Development environments (having proper ANDROID_HOME, etc) git clone https://github.com/firebase/firebase-android-sdk.git # or git clone git@github.com:firebase/firebase-android-sdk.git cd firebase-android-sdk # check out pipeline feature branch git fetch origin feat/pipeline/private-preview git checkout feat/pipeline/private-preview # publish firebase SDK (without crashlytics) to maven local ./gradlew publishToMavenLocal -x :firebase-crashlytics:publishToMavenLocal -x :firebase-crashlytics-ndk:publishToMavenLocal # Optionally, if you want crashlytics built and published to mavel local # Make sure you have Android NDK 21 installed git submodule update --init --recursive ./gradlew publishToMavenLocal
- Aggiungi
mavenLocala settings.gradle.kts a livello di progetto :dependencyResolutionManagement { repositories { mavenLocal() // Add this line .. } }
- Poi aggiungi la versione locale dell'SDK:
... // Firestore 99.0.0-pipeline.preview.1 has pipelines implementation("com.google.firebase:firebase-firestore:99.0.0-pipeline.preview.1") // Firebase Authentication implementation("com.google.firebase:firebase-auth") ...
Python
- Clona l'SDK Python di Firestore ed estrai il ramo di anteprima della pipeline:
git clone https://github.com/googleapis/python-firestore.git # or git clone git@github.com:googleapis/python-firestore.git cd python-firestore # check out pipeline preview branch git fetch origin pipeline-preview git checkout pipeline-preview
- Installa l'SDK del server python-firestore locale:
python -m pip install -e .
- Installa l'SDK Firebase Python Admin come di consueto:
pip install --user firebase-admin
Inizializza Cloud Firestore
Inizializza un'istanza di Cloud Firestore:
Web
import { initializeApp } from "firebase/app"; import { getFirestore } from "firebase/firestore"; // TODO: Replace the following with your app's Firebase project configuration // See: https://support.google.com/firebase/answer/7015592 const firebaseConfig = { FIREBASE_CONFIGURATION }; // Initialize Firebase const app = initializeApp(firebaseConfig); // When initializing Firestore, remember to use the name of the database you created earlier: const db = initializeFirestore(app, {}, 'your-new-enterprise-database');
Sostituisci FIREBASE_CONFIGURATION con il
firebaseConfig della tua app web.
Per rendere persistenti i dati quando il dispositivo perde la connessione, consulta la documentazione Attivare i dati offline.
Swift
import FirebaseCore import FirebaseFirestore FirebaseApp.configure() // When initializing Firestore, remember to use the name of the database you created earlier: let db = Firestore.firestore(database: "your-new-enterprise-database")
Kotlin
// Access a Cloud Firestore instance from your Activity // When initializing Firestore, remember to use the name of the database you created earlier: val firestore = FirebaseFirestore.getInstance("your-new-enterprise-database")
Java
// Access a Cloud Firestore instance from your Activity // When initializing Firestore, remember to use the name of the database you created earlier: FirebaseFirestore firestore = FirebaseFirestore.getInstance("your-new-enterprise-database");
Python
Esegui l'autenticazione con il database aziendale utilizzando l'SDK Admin:
import firebase_admin from firebase_admin import firestore def main(): default_app = firebase_admin.initialize_app() client = firestore.client(default_app, "your-new-enterprise-database") query = client.pipeline().database().limit(5) for result in query.execute(): print(result.data()) if __name__ == "__main__": main()
Aggiungere dati utilizzando le operazioni principali
Per esplorare le operazioni Core e le operazioni Pipeline per eseguire query sui dati, aggiungi dati al database utilizzando le operazioni Core.
Cloud Firestore archivia i dati in documenti, che vengono archiviati in raccolte. Cloud Firestore crea raccolte e documenti in modo implicito la prima volta che aggiungi dati al documento. Non è necessario creare esplicitamente raccolte o documenti.
Crea una nuova raccolta e un nuovo documento utilizzando il seguente codice di esempio.
Web
import { collection, addDoc } from "firebase/firestore"; try { const docRef = await addDoc(collection(db, "users"), { first: "Ada", last: "Lovelace", born: 1815 }); console.log("Document written with ID: ", docRef.id); } catch (e) { console.error("Error adding document: ", e); }
Web
db.collection("users").add({ first: "Ada", last: "Lovelace", born: 1815 }) .then((docRef) => { console.log("Document written with ID: ", docRef.id); }) .catch((error) => { console.error("Error adding document: ", error); });
Swift
// Add a new document with a generated ID do { let ref = try await db.collection("users").addDocument(data: [ "first": "Ada", "last": "Lovelace", "born": 1815 ]) print("Document added with ID: \(ref.documentID)") } catch { print("Error adding document: \(error)") }
Kotlin
// Create a new user with a first and last name val user = hashMapOf( "first" to "Ada", "last" to "Lovelace", "born" to 1815, ) // Add a new document with a generated ID db.collection("users") .add(user) .addOnSuccessListener { documentReference -> Log.d(TAG, "DocumentSnapshot added with ID: ${documentReference.id}") } .addOnFailureListener { e -> Log.w(TAG, "Error adding document", e) }
Java
// Create a new user with a first and last name Map<String, Object> user = new HashMap<>(); user.put("first", "Ada"); user.put("last", "Lovelace"); user.put("born", 1815); // Add a new document with a generated ID db.collection("users") .add(user) .addOnSuccessListener(new OnSuccessListener<DocumentReference>() { @Override public void onSuccess(DocumentReference documentReference) { Log.d(TAG, "DocumentSnapshot added with ID: " + documentReference.getId()); } }) .addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { Log.w(TAG, "Error adding document", e); } });
Python
Ora aggiungi un altro documento alla raccolta users. Tieni presente che questo documento
include una coppia chiave-valore (secondo nome) che non è presente nel primo
documento. I documenti di una raccolta possono contenere diversi set di informazioni.
Web
// Add a second document with a generated ID. import { addDoc, collection } from "firebase/firestore"; try { const docRef = await addDoc(collection(db, "users"), { first: "Alan", middle: "Mathison", last: "Turing", born: 1912 }); console.log("Document written with ID: ", docRef.id); } catch (e) { console.error("Error adding document: ", e); }
Web
// Add a second document with a generated ID. db.collection("users").add({ first: "Alan", middle: "Mathison", last: "Turing", born: 1912 }) .then((docRef) => { console.log("Document written with ID: ", docRef.id); }) .catch((error) => { console.error("Error adding document: ", error); });
Swift
// Add a second document with a generated ID. do { let ref = try await db.collection("users").addDocument(data: [ "first": "Alan", "middle": "Mathison", "last": "Turing", "born": 1912 ]) print("Document added with ID: \(ref.documentID)") } catch { print("Error adding document: \(error)") }
Kotlin
// Create a new user with a first, middle, and last name val user = hashMapOf( "first" to "Alan", "middle" to "Mathison", "last" to "Turing", "born" to 1912, ) // Add a new document with a generated ID db.collection("users") .add(user) .addOnSuccessListener { documentReference -> Log.d(TAG, "DocumentSnapshot added with ID: ${documentReference.id}") } .addOnFailureListener { e -> Log.w(TAG, "Error adding document", e) }
Java
// Create a new user with a first, middle, and last name Map<String, Object> user = new HashMap<>(); user.put("first", "Alan"); user.put("middle", "Mathison"); user.put("last", "Turing"); user.put("born", 1912); // Add a new document with a generated ID db.collection("users") .add(user) .addOnSuccessListener(new OnSuccessListener<DocumentReference>() { @Override public void onSuccess(DocumentReference documentReference) { Log.d(TAG, "DocumentSnapshot added with ID: " + documentReference.getId()); } }) .addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { Log.w(TAG, "Error adding document", e); } });
Python
Lettura dei dati utilizzando le operazioni Core
Utilizza il visualizzatore di dati nella Console Firebase per verificare rapidamente di aver aggiunto dati a Cloud Firestore.
Puoi anche utilizzare il metodo "get" per recuperare l'intera raccolta.
Web
import { collection, getDocs } from "firebase/firestore"; const querySnapshot = await getDocs(collection(db, "users")); querySnapshot.forEach((doc) => { console.log(`${doc.id} => ${doc.data()}`); });
Web
db.collection("users").get().then((querySnapshot) => { querySnapshot.forEach((doc) => { console.log(`${doc.id} => ${doc.data()}`); }); });
Swift
do { let snapshot = try await db.collection("users").getDocuments() for document in snapshot.documents { print("\(document.documentID) => \(document.data())") } } catch { print("Error getting documents: \(error)") }
Kotlin
db.collection("users") .get() .addOnSuccessListener { result -> for (document in result) { Log.d(TAG, "${document.id} => ${document.data}") } } .addOnFailureListener { exception -> Log.w(TAG, "Error getting documents.", exception) }
Java
db.collection("users") .get() .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() { @Override public void onComplete(@NonNull Task<QuerySnapshot> task) { if (task.isSuccessful()) { for (QueryDocumentSnapshot document : task.getResult()) { Log.d(TAG, document.getId() + " => " + document.getData()); } } else { Log.w(TAG, "Error getting documents.", task.getException()); } } });
Python
users_ref = db.collection("users") docs = users_ref.stream() for doc in docs: print(f"{doc.id} => {doc.to_dict()}")
Lettura dei dati utilizzando le operazioni della pipeline
Ora puoi confrontare l'esperienza di query della pipeline con l'esperienza di query principale.
Web
const readDataPipeline = db.pipeline() .collection("users"); // Execute the pipeline and handle the result try { const querySnapshot = await execute(readDataPipeline); querySnapshot.results.forEach((result) => { console.log(`${result.id} => ${result.data()}`); }); } catch (error) { console.error("Error getting documents: ", error); }
Swift
do { // Initialize a Firestore Pipeline instance and specify the "users" collection as the // input stage. let snapshot = try await db.pipeline() .collection("users") .execute() // Execute the pipeline to retrieve documents. // Iterate through the documents in the pipeline results, similar to a regular query // snapshot. for result in snapshot.results { print("\(result.id ?? "no ID") => \(result.data)") } } catch { print("Error getting documents with pipeline: \(error)") }
Kotlin
val readDataPipeline = db.pipeline() .collection("users") // Execute the pipeline and handle the result readDataPipeline.execute() .addOnSuccessListener { result -> for (document in result) { println("${document.getId()} => ${document.getData()}") } } .addOnFailureListener { exception -> println("Error getting documents: $exception") }
Java
Pipeline readDataPipeline = db.pipeline() .collection("users"); readDataPipeline.execute() .addOnSuccessListener(new OnSuccessListener<Pipeline.Snapshot>() { @Override public void onSuccess(Pipeline.Snapshot snapshot) { for (PipelineResult result : snapshot.getResults()) { System.out.println(result.getId() + " => " + result.getData()); } } }) .addOnFailureListener(new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { System.out.println("Error getting documents: " + e); } });
Python
pipeline = client.pipeline().collection("users") for result in pipeline.execute(): print(f"{result.id} => {result.data()}")
Proteggi i tuoi dati
Se utilizzi l'SDK per le piattaforme web, Android o Apple, utilizza Firebase Authentication e Cloud Firestore Security Rules per proteggere i tuoi dati in Cloud Firestore.
Ecco alcuni set di regole di base che puoi utilizzare per iniziare. Puoi modificare le regole di sicurezza nella scheda Regole della console.
Autorizzazione richiesta
// Allow read/write access to a document keyed by the user's UID
service cloud.firestore {
match /databases/{database}/documents {
match /users/{uid} {
allow read, write: if request.auth != null && request.auth.uid == uid;
}
}
}
Modalità di produzione
// Deny read/write access to all users under any conditions
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if false;
}
}
}
Prima di eseguire il deployment dell'app web, Android o iOS in produzione, adotta anche misure per assicurarti che solo i client della tua app possano accedere ai tuoi dati Cloud Firestore. Consulta la documentazione di App Check.
Se utilizzi uno degli SDK server, utilizza Identity and Access Management (IAM) per proteggere i tuoi dati in Cloud Firestore.
Passaggi successivi
Approfondisci le tue conoscenze sulle operazioni di Core e Pipeline con i seguenti argomenti:
- Assicurati di conoscere le differenze tra le operazioni principali e quelle della pipeline.
- Scopri di più sull'esecuzione di query con le operazioni principali
- Scopri di più sulle query con le operazioni della pipeline.