了解 2023 年 Google I/O 大会上介绍的 Firebase 亮点。了解详情

Model danych Cloud Firestore

Cloud Firestore to zorientowana na dokumenty baza danych NoSQL. W przeciwieństwie do bazy danych SQL nie ma tabel ani wierszy. Zamiast tego przechowujesz dane w dokumentach , które są zorganizowane w kolekcje .

Każdy dokument zawiera zestaw par klucz-wartość. Cloud Firestore jest zoptymalizowany do przechowywania dużych kolekcji małych dokumentów.

Wszystkie dokumenty muszą być przechowywane w zbiorach. Dokumenty mogą zawierać podkolekcje i obiekty zagnieżdżone, z których oba mogą zawierać prymitywne pola, takie jak ciągi znaków, lub złożone obiekty, takie jak listy.

Kolekcje i dokumenty są tworzone niejawnie w Cloud Firestore. Wystarczy przypisać dane do dokumentu w kolekcji. Jeśli kolekcja lub dokument nie istnieje, Cloud Firestore je utworzy.

Dokumenty

W Cloud Firestore jednostką przechowywania jest dokument. Dokument jest lekkim rekordem zawierającym pola, które są mapowane na wartości. Każdy dokument jest identyfikowany przez nazwę.

Dokument reprezentujący użytkownika alovelace może wyglądać tak:

  • zakochana

    first : "Ada"
    last : "Lovelace"
    born : 1815

Złożone, zagnieżdżone obiekty w dokumencie nazywane są mapami. Na przykład możesz uporządkować nazwę użytkownika z powyższego przykładu za pomocą mapy w następujący sposób:

  • zakochana

    name :
    first : "Ada"
    last : "Lovelace"
    born : 1815

Możesz zauważyć, że dokumenty wyglądają bardzo podobnie do formatu JSON. W zasadzie są. Istnieją pewne różnice (na przykład dokumenty obsługują dodatkowe typy danych i są ograniczone do 1 MB), ale ogólnie można traktować dokumenty jako lekkie rekordy JSON.

Kolekcje

Dokumenty żyją w kolekcjach, które są po prostu pojemnikami na dokumenty. Na przykład możesz mieć kolekcję users zawierającą różnych użytkowników, z których każdy jest reprezentowany przez dokument:

  • użytkowników

    • zakochana

      first : "Ada"
      last : "Lovelace"
      born : 1815

    • wychowanie

      first : "Alan"
      last : "Turing"
      born : 1912

Cloud Firestore jest bezschematowy, więc masz pełną swobodę w zakresie tego, jakie pola umieszczasz w każdym dokumencie i jakie typy danych przechowujesz w tych polach. Dokumenty w tej samej kolekcji mogą zawierać różne pola lub przechowywać w tych polach różne typy danych. Dobrym pomysłem jest jednak używanie tych samych pól i typów danych w wielu dokumentach, co ułatwi tworzenie zapytań dotyczących dokumentów.

Kolekcja zawiera dokumenty i nic więcej. Nie może bezpośrednio zawierać nieprzetworzonych pól z wartościami ani innych kolekcji. (Zobacz Dane hierarchiczne , aby dowiedzieć się, jak uporządkować bardziej złożone dane w Cloud Firestore).

Nazwy dokumentów w kolekcji są unikalne. Możesz podać własne klucze, takie jak identyfikatory użytkowników, lub możesz pozwolić Cloud Firestore na automatyczne tworzenie losowych identyfikatorów.

Nie musisz „tworzyć” ani „usuwać” kolekcji. Po utworzeniu pierwszego dokumentu w kolekcji kolekcja istnieje. Jeśli usuniesz wszystkie dokumenty w kolekcji, przestanie ona istnieć.

Bibliografia

Każdy dokument w Cloud Firestore jest jednoznacznie identyfikowany na podstawie jego lokalizacji w bazie danych. Poprzedni przykład alovelace dokument znajdujący się w kolekcji users . Aby odwołać się do tej lokalizacji w kodzie, możesz utworzyć do niej odwołanie .

Web modular API

import { doc } from "firebase/firestore";

const alovelaceDocumentRef = doc(db, 'users', 'alovelace');

Web namespaced API

var alovelaceDocumentRef = db.collection('users').doc('alovelace');
Szybki
Uwaga: ten produkt nie jest dostępny w docelowych systemach watchOS i App Clip.
let alovelaceDocumentRef = db.collection("users").document("alovelace")
Cel C
Uwaga: ten produkt nie jest dostępny w docelowych systemach watchOS i App Clip.
FIRDocumentReference *alovelaceDocumentRef =
    [[self.db collectionWithPath:@"users"] documentWithPath:@"alovelace"];

Kotlin+KTX

val alovelaceDocumentRef = db.collection("users").document("alovelace")

Java

DocumentReference alovelaceDocumentRef = db.collection("users").document("alovelace");

Dart

final alovelaceDocumentRef = db.collection("users").doc("alovelace");
Jawa
// Reference to a document with id "alovelace" in the collection "users"
DocumentReference document = db.collection("users").document("alovelace");
Pyton
a_lovelace_ref = db.collection('users').document('alovelace')

Python

a_lovelace_ref = db.collection("users").document("alovelace")
C++
DocumentReference alovelace_document_reference =
    db->Collection("users").Document("alovelace");
Node.js
const alovelaceDocumentRef = db.collection('users').doc('alovelace');
Iść

import (
	"cloud.google.com/go/firestore"
)

func createDocReference(client *firestore.Client) {

	alovelaceRef := client.Collection("users").Doc("alovelace")

	_ = alovelaceRef
}
PHP

PHP

Aby uzyskać więcej informacji na temat instalowania i tworzenia klienta Cloud Firestore, zapoznaj się z Bibliotekami klienta Cloud Firestore .

$document = $db->collection('samples/php/users')->document('alovelace');
Jedność
DocumentReference documentRef = db.Collection("users").Document("alovelace");
C#

C#

Aby uzyskać więcej informacji na temat instalowania i tworzenia klienta Cloud Firestore, zapoznaj się z Bibliotekami klienta Cloud Firestore .

DocumentReference documentRef = db.Collection("users").Document("alovelace");
Rubin
document_ref = firestore.col("users").doc("alovelace")

Odniesienie to lekki obiekt, który po prostu wskazuje lokalizację w bazie danych. Odniesienie można utworzyć niezależnie od tego, czy istnieją tam dane, a utworzenie odniesienia nie powoduje wykonania żadnych operacji sieciowych.

Możesz także tworzyć odniesienia do kolekcji :

Web modular API

import { collection } from "firebase/firestore";

const usersCollectionRef = collection(db, 'users');

Web namespaced API

var usersCollectionRef = db.collection('users');
Szybki
Uwaga: ten produkt nie jest dostępny w docelowych systemach watchOS i App Clip.
let usersCollectionRef = db.collection("users")
Cel C
Uwaga: ten produkt nie jest dostępny w docelowych systemach watchOS i App Clip.
FIRCollectionReference *usersCollectionRef = [self.db collectionWithPath:@"users"];

Kotlin+KTX

val usersCollectionRef = db.collection("users")

Java

CollectionReference usersCollectionRef = db.collection("users");

Dart

final usersCollectionRef = db.collection("users");
Jawa
// Reference to the collection "users"
CollectionReference collection = db.collection("users");
Pyton
users_ref = db.collection('users')

Python

users_ref = db.collection("users")
C++
CollectionReference users_collection_reference = db->Collection("users");
Node.js
const usersCollectionRef = db.collection('users');
Iść

import (
	"cloud.google.com/go/firestore"
)

func createCollectionReference(client *firestore.Client) {
	usersRef := client.Collection("users")

	_ = usersRef
}
PHP

PHP

Aby uzyskać więcej informacji na temat instalowania i tworzenia klienta Cloud Firestore, zapoznaj się z Bibliotekami klienta Cloud Firestore .

$collection = $db->collection('samples/php/users');
Jedność
CollectionReference collectionRef = db.Collection("users");
C#

C#

Aby uzyskać więcej informacji na temat instalowania i tworzenia klienta Cloud Firestore, zapoznaj się z Bibliotekami klienta Cloud Firestore .

CollectionReference collectionRef = db.Collection("users");
Rubin
collection_ref = firestore.col "users"

Dla wygody można również tworzyć odwołania, określając ścieżkę do dokumentu lub kolekcji jako ciąg, z komponentami ścieżki oddzielonymi ukośnikiem ( / ). Na przykład, aby utworzyć odwołanie do dokumentu alovelace :

Web modular API

import { doc } from "firebase/firestore"; 

const alovelaceDocumentRef = doc(db, 'users/alovelace');

Web namespaced API

var alovelaceDocumentRef = db.doc('users/alovelace');
Szybki
Uwaga: ten produkt nie jest dostępny w docelowych systemach watchOS i App Clip.
let aLovelaceDocumentReference = db.document("users/alovelace")
Cel C
Uwaga: ten produkt nie jest dostępny w docelowych systemach watchOS i App Clip.
FIRDocumentReference *aLovelaceDocumentReference =
    [self.db documentWithPath:@"users/alovelace"];

Kotlin+KTX

val alovelaceDocumentRef = db.document("users/alovelace")

Java

DocumentReference alovelaceDocumentRef = db.document("users/alovelace");

Dart

final aLovelaceDocRef = db.doc("users/alovelace");
Jawa
// Reference to a document with id "alovelace" in the collection "users"
DocumentReference document = db.document("users/alovelace");
Pyton
a_lovelace_ref = db.document('users/alovelace')

Python

a_lovelace_ref = db.document("users/alovelace")
C++
DocumentReference alovelace_document = db->Document("users/alovelace");
Node.js
const alovelaceDocumentRef = db.doc('users/alovelace');
Iść

import (
	"cloud.google.com/go/firestore"
)

func createDocReferenceFromString(client *firestore.Client) {
	// Reference to a document with id "alovelace" in the collection "users"
	alovelaceRef := client.Doc("users/alovelace")

	_ = alovelaceRef
}
PHP

PHP

Aby uzyskać więcej informacji na temat instalowania i tworzenia klienta Cloud Firestore, zapoznaj się z Bibliotekami klienta Cloud Firestore .

$document = $db->document('users/alovelace');
Jedność
DocumentReference documentRef = db.Document("users/alovelace");
C#

C#

Aby uzyskać więcej informacji na temat instalowania i tworzenia klienta Cloud Firestore, zapoznaj się z Bibliotekami klienta Cloud Firestore .

DocumentReference documentRef = db.Document("users/alovelace");
Rubin
document_path_ref = firestore.doc "users/alovelace"

Dane hierarchiczne

Aby zrozumieć, jak działają hierarchiczne struktury danych w Cloud Firestore, rozważ przykładową aplikację czatu z wiadomościami i pokojami rozmów.

Możesz utworzyć kolekcję o nazwie rooms do przechowywania różnych pokojów rozmów:

  • pokoje

    • sala A

      name : "my chat room"

    • sala B

      ...

Teraz, gdy masz pokoje rozmów, zdecyduj, jak przechowywać wiadomości. Możesz nie chcieć przechowywać ich w dokumencie pokoju rozmów. Dokumenty w Cloud Firestore powinny być lekkie, a pokój rozmów może zawierać dużą liczbę wiadomości. Możesz jednak tworzyć dodatkowe kolekcje w dokumencie swojego pokoju rozmów jako kolekcje podrzędne.

Podkolekcje

Najlepszym sposobem przechowywania komunikatów w tym scenariuszu jest użycie podkolekcji. Podkolekcja to kolekcja powiązana z określonym dokumentem.

Możesz utworzyć podkolekcję o nazwie messages dla każdego dokumentu pokoju w swojej kolekcji rooms :

  • pokoje

    • sala A

      name : "my chat room"

      • wiadomosci

        • wiadomość 1

          from : "alex"
          msg : "Hello World!"

        • wiadomość 2

          ...

    • sala B

      ...

W tym przykładzie utworzyłbyś odwołanie do wiadomości w podzbiorze z następującym kodem:

Web modular API

import { doc } from "firebase/firestore"; 

const messageRef = doc(db, "rooms", "roomA", "messages", "message1");

Web namespaced API

var messageRef = db.collection('rooms').doc('roomA')
                .collection('messages').doc('message1');
Szybki
Uwaga: ten produkt nie jest dostępny w docelowych systemach watchOS i App Clip.
let messageRef = db
    .collection("rooms").document("roomA")
    .collection("messages").document("message1")
Cel C
Uwaga: ten produkt nie jest dostępny w docelowych systemach watchOS i App Clip.
FIRDocumentReference *messageRef =
    [[[[self.db collectionWithPath:@"rooms"] documentWithPath:@"roomA"]
    collectionWithPath:@"messages"] documentWithPath:@"message1"];

Kotlin+KTX

val messageRef = db
    .collection("rooms").document("roomA")
    .collection("messages").document("message1")

Java

DocumentReference messageRef = db
        .collection("rooms").document("roomA")
        .collection("messages").document("message1");

Dart

final messageRef = db
    .collection("rooms")
    .doc("roomA")
    .collection("messages")
    .doc("message1");
Jawa
// Reference to a document in subcollection "messages"
DocumentReference document =
    db.collection("rooms").document("roomA").collection("messages").document("message1");
Pyton
room_a_ref = db.collection('rooms').document('roomA')
message_ref = room_a_ref.collection('messages').document('message1')

Python

room_a_ref = db.collection("rooms").document("roomA")
message_ref = room_a_ref.collection("messages").document("message1")
C++
DocumentReference message_reference = db->Collection("rooms")
    .Document("roomA")
    .Collection("messages")
    .Document("message1");
Node.js
const messageRef = db.collection('rooms').doc('roomA')
  .collection('messages').doc('message1');
Iść

import (
	"cloud.google.com/go/firestore"
)

func createSubcollectionReference(client *firestore.Client) {
	messageRef := client.Collection("rooms").Doc("roomA").
		Collection("messages").Doc("message1")

	_ = messageRef
}
PHP

PHP

Aby uzyskać więcej informacji na temat instalowania i tworzenia klienta Cloud Firestore, zapoznaj się z Bibliotekami klienta Cloud Firestore .

$document = $db
    ->collection('rooms')
    ->document('roomA')
    ->collection('messages')
    ->document('message1');
Jedność
DocumentReference documentRef = db
	.Collection("Rooms").Document("RoomA")
	.Collection("Messages").Document("Message1");
C#

C#

Aby uzyskać więcej informacji na temat instalowania i tworzenia klienta Cloud Firestore, zapoznaj się z Bibliotekami klienta Cloud Firestore .

DocumentReference documentRef = db
    .Collection("Rooms").Document("RoomA")
    .Collection("Messages").Document("Message1");
Rubin
message_ref = firestore.col("rooms").doc("roomA").col("messages").doc("message1")

Zwróć uwagę na naprzemienny układ zbiorów i dokumentów. Twoje kolekcje i dokumenty muszą zawsze być zgodne z tym wzorem. Nie można odwoływać się do kolekcji w kolekcji ani do dokumentu w dokumencie.

Podkolekcje umożliwiają hierarchiczną strukturę danych, ułatwiając dostęp do danych. Aby uzyskać wszystkie wiadomości w roomA , możesz utworzyć odniesienie do kolekcji do messages podzbioru i wchodzić z nim w interakcję, tak jak z każdym innym odniesieniem do kolekcji.

Dokumenty w podkolekcjach mogą również zawierać podkolekcje, co pozwala na dalsze zagnieżdżanie danych. Możesz zagnieżdżać dane do 100 poziomów w głąb.