Wprowadzenie do Firestore w wersji Enterprise

Z tego krótkiego wprowadzenia dowiesz się, jak skonfigurować Firestore w wersji Enterprise, dodać dane, a następnie użyć operacji podstawowych lub operacji potoków, aby wysłać zapytanie o dane dodane w konsoli Firebase.

Cloud Firestore obsługuje pakiety SDK na urządzenia mobilne i do sieci oraz biblioteki klienta serwera:

  • Cloud Firestore obsługuje pakiety SDK na Androida, iOS, do sieci i inne. W połączeniu z Cloud Firestore Security Rules i Firebase Authentication, pakiety SDK na urządzenia mobilne i do sieci obsługują architektury aplikacji bezserwerowych, w których klienci łączą się bezpośrednio z Twoją Cloud Firestore bazą danych.

  • Cloud Firestore obsługuje biblioteki klienta serwera w językach Java, Node.js i Python. Użyj tych bibliotek klienta, aby skonfigurować uprzywilejowane środowiska serwera z pełnym dostępem do bazy danych. Więcej informacji o tych bibliotekach znajdziesz w krótkim wprowadzeniu do bibliotek klienta serwera.

Tworzenie bazy danych Firestore w wersji Enterprise

  1. Jeśli jeszcze tego nie zrobisz, utwórz projekt w Firebase: w Firebase konsoli kliknij Dodaj projekt, a następnie postępuj zgodnie z instrukcjami wyświetlanymi na ekranie, aby utworzyć projekt w Firebase lub dodać usługi Firebase do istniejącego Google Cloud projektu.

  2. Otwórz projekt w konsoli Firebase. W panelu po lewej stronie rozwiń Build, a następnie kliknij Firestore database.

  3. Kliknij Utwórz bazę danych.

  4. W przypadku trybu bazy danych wybierz Enterprise.

  5. W przypadku trybu działania wybierz Firestore w trybie natywnym, który obsługuje operacje podstawowe i operacje potoków.

  6. Wybierz lokalizację bazy danych.

  7. Wybierz tryb początkowy dla Cloud Firestore Security Rules:

    Tryb testowy

    Dobry na początek korzystania z bibliotek klienta na urządzenia mobilne i do sieci, ale umożliwia każdemu odczytywanie i nadpisywanie danych. Po testowaniu upewnij się, że zapoznałeś się z sekcją Zabezpieczanie danych.

    Aby rozpocząć korzystanie z pakietu SDK do sieci, na platformy Apple lub na Androida, wybierz tryb testowy.

    Tryb produkcji

    Odmowa wszystkich odczytów i zapisów od klientów mobilnych i internetowych. Uwierzytelnione serwery aplikacji (Python) nadal mogą uzyskiwać dostęp do bazy danych.

    Początkowy zestaw Cloud Firestore Security Rules będzie stosowany do domyślnej Cloud Firestore bazy danych. Jeśli utworzysz wiele baz danych dla swojego projektu, możesz wdrożyć Cloud Firestore Security Rules dla każdej z nich.

  8. Kliknij Utwórz.

Gdy włączysz Firestore w wersji Enterprise, włączy się też interfejs API w Cloud API Manager.

Konfigurowanie środowiska programistycznego

Dodaj do aplikacji wymagane zależności i biblioteki klienta.

Web

  1. Postępuj zgodnie z instrukcjami, aby dodać Firebase do aplikacji internetowej.
  2. Pakiet SDK Cloud Firestore jest dostępny jako pakiet npm.
    npm install firebase@12.12.1 --save
    Musisz zaimportować zarówno Firebase, jak i Cloud Firestore.
    import { initializeApp } from "firebase/app";
    import { getFirestore } from "firebase/firestore";
iOS+

Postępuj zgodnie z instrukcjami, aby dodać Firebase do aplikacji na platformę Apple.

Do instalacji zależności Firebase i do zarządzania nimi możesz używać menedżera pakietów Swift.

  1. Po otwarciu projektu aplikacji wybierz w Xcode opcję File > Swift Packages > Add Package Dependency (Plik > Pakiety Swift > Dodaj zależność pakietu).
  2. Gdy pojawi się prośba, dodaj repozytorium pakietu SDK Firebase na platformy Apple:
  3.   https://github.com/firebase/firebase-ios-sdk
      
  4. Wybierz bibliotekę Firestore.
  5. Gdy skończysz, Xcode zacznie automatycznie wyszukiwać i pobierać Twoje zależności w tle.
Android
  1. Postępuj zgodnie z instrukcjami, aby dodać Firebase do aplikacji na Androida.
  2. Korzystając z listy BoM Firebase dla Androida, zadeklaruj zależność z biblioteką Cloud Firestore na Androida w pliku Gradle modułu (na poziomie aplikacji) (zwykle app/build.gradle.kts lub app/build.gradle).
    dependencies {
        // Import the BoM for the Firebase platform
        implementation(platform("com.google.firebase:firebase-bom:34.12.0"))
    
        // Declare the dependency for the Cloud Firestore library
        // When using the BoM, you don't specify versions in Firebase library dependencies
        implementation("com.google.firebase:firebase-firestore")
    }

    Gdy korzystamy z listy BoM Firebase dla Androida, aplikacja zawsze używa zgodnych wersji bibliotek Firebase na Androida.

    (Alternatywnie) Zadeklaruj zależności biblioteki Firebase bez użycia BoM

    Jeśli nie chcesz używać Firebase BoM, musisz określić wersję każdej biblioteki Firebase w wierszu zależności.

    Pamiętaj, że jeśli w aplikacji używasz wielu bibliotek Firebase, zdecydowanie zalecamy używanie BoM do zarządzania wersjami bibliotek, co zapewnia zgodność wszystkich wersji.

    dependencies {
        // Declare the dependency for the Cloud Firestore library
        // When NOT using the BoM, you must specify versions in Firebase library dependencies
        implementation("com.google.firebase:firebase-firestore:26.2.0")
    }

    Szukasz modułu biblioteki przeznaczonego specjalnie dla języka Kotlin? Od wersji z października 2023 r., deweloperzy korzystający z języków Kotlin i Java mogą polegać na głównym module biblioteki (szczegóły znajdziesz w odpowiedzi na najczęstsze pytania dotyczące tej inicjatywy).

Inicjowanie Cloud Firestore

Zainicjuj instancję 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');

Zastąp FIREBASE_CONFIGURATION wartością firebaseConfig aplikacji internetowej.

Aby zachować dane, gdy urządzenie utraci połączenie, zapoznaj się z dokumentacją Włączanie danych 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");

Dodawanie danych za pomocą operacji podstawowych

Aby poznać operacje podstawowe i operacje potoków do wysyłania zapytań o dane, dodaj dane do bazy danych za pomocą operacji podstawowych.

Cloud Firestore przechowuje dane w dokumentach, które są przechowywane w kolekcjach. Cloud Firestore tworzy kolekcje i dokumenty niejawnie gdy po raz pierwszy dodajesz dane do dokumentu. Nie musisz jawnie tworzyć kolekcji ani dokumentów.

Utwórz nową kolekcję i dokument, korzystając z tego przykładowego kodu.

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
Uwaga: ta usługa nie jest dostępna w przypadku watchOS i App Clip.
// 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);
            }
        });

Teraz dodaj kolejny dokument do kolekcji users. Zwróć uwagę, że ten dokument zawiera parę klucz-wartość (drugie imię), która nie występuje w pierwszym dokumencie. Dokumenty w kolekcji mogą zawierać różne zestawy informacji.

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
Uwaga: ta usługa nie jest dostępna w przypadku watchOS i App Clip.
// 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);
            }
        });

Odczytywanie danych za pomocą operacji podstawowych

Aby szybko sprawdzić, czy dane zostały dodane do Cloud Firestore, użyj przeglądarki danych w konsoli Firebase.

Możesz też użyć metody „get”, aby pobrać całą kolekcję.

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
Uwaga: ta usługa nie jest dostępna w przypadku watchOS i App Clip.
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());
                }
            }
        });

Odczytywanie danych za pomocą operacji potoków

Teraz możesz porównać sposób wysyłania zapytań za pomocą operacji potoków z operacjami podstawowymi.

Web

// The import/require of "firebase/firestore/pipelines" has a side-effect
// of extending the Firestore class with the `.pipeline()` method.
// Without this import/require, you will not be able to create a Pipeline.
// import { execute } from "firebase/firestore/pipelines";
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);
    }
});

Zabezpieczanie danych za pomocą pakietów SDK na urządzenia mobilne i do sieci

Jeśli używasz pakietu SDK do sieci, na Androida lub na platformy Apple, zabezpiecz dane w Cloud Firestore za pomocą Firebase Authentication i Cloud Firestore Security Rules.

Oto kilka podstawowych zestawów reguł, których możesz użyć na początek. Reguły bezpieczeństwa możesz modyfikować na karcie Reguły w konsoli.

Wymagane uwierzytelnianie

// 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;
    }
  }
}

Tryb produkcji

// Deny read/write access to all users under any conditions
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if false;
    }
  }
}

Zanim wdrożysz aplikację internetową, na Androida lub na iOS w środowisku produkcyjnym, podejmij też kroki aby zapewnić, że tylko klienci aplikacji będą mogli uzyskiwać dostęp do danych Cloud Firestore. Zapoznaj się z dokumentacją dotyczącą sprawdzania aplikacji.

Jeśli używasz jednego z pakietów SDK serwera, zabezpiecz dane za pomocą usługi zarządzania tożsamościami i dostępem (IAM) w Cloud Firestore.

Dalsze kroki

Pogłębiaj wiedzę o operacjach podstawowych i operacjach potoków, korzystając z tych tematów:

  • Więcej informacji o wysyłaniu zapytań za pomocą operacji podstawowych
  • Więcej informacji o wysyłaniu zapytań za pomocą operacji potoków
  • Dowiedz się, jak ulepszyć narzędzia do tworzenia AI, aby skuteczniej wykonywać zadania i korzystać ze sprawdzonych metod Cloud Firestore (np. tworzenia Cloud Firestore Security Rules) za pomocą umiejętności agenta Firebase.