Cloud Firestore to baza danych NoSQL zorientowana na dokumenty. 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 pod kątem 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ć pola pierwotne, takie jak ciągi, lub obiekty złożone, takie jak listy.
Kolekcje i dokumenty są tworzone niejawnie w Cloud Firestore. Po prostu przypisz dane do dokumentu w kolekcji. Jeśli kolekcja lub dokument nie istnieje, Cloud Firestore go utworzy.
Dokumenty
W Cloud Firestore jednostką pamięci jest dokument. Dokument to lekki rekord zawierający pola, które są mapowane na wartości. Każdy dokument jest identyfikowany nazwą.
Dokument reprezentujący alovelace
użytkownika może wyglądać tak:
first : "Ada"
last : "Lovelace"
born : 1815
Złożone, zagnieżdżone obiekty w dokumencie nazywane są mapami. Na przykład możesz ustrukturyzować nazwę użytkownika z powyższego przykładu za pomocą mapy w następujący sposób:
name :
first : "Ada"
last : "Lovelace"
born : 1815
Możesz zauważyć, że dokumenty wyglądają bardzo podobnie do JSON. W rzeczywistości w zasadzie są. Istnieją pewne różnice (na przykład dokumenty obsługują dodatkowe typy danych i mają ograniczony rozmiar do 1 MB), ale ogólnie można traktować dokumenty jako lekkie rekordy JSON.
Kolekcje
Dokumenty żyją w zbiorach, 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:
first : "Ada"
last : "Lovelace"
born : 1815
first : "Alan"
last : "Turing"
born : 1912
Cloud Firestore jest pozbawiony schematów, więc masz pełną swobodę w zakresie tego, jakie pola umieszczasz w każdym dokumencie i jakie typy danych przechowujesz w tych polach. Wszystkie dokumenty w tej samej kolekcji mogą zawierać różne pola lub przechowywać w nich różne typy danych. Jednak dobrym pomysłem jest używanie tych samych pól i typów danych w wielu dokumentach, aby łatwiej można było wyszukiwać dokumenty.
Zbiór zawiera dokumenty i nic więcej. Nie może bezpośrednio zawierać nieprzetworzonych pól z wartościami i nie może zawierać 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 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, kolekcja już nie istnieje.
Bibliografia
Każdy dokument w Cloud Firestore jest jednoznacznie identyfikowany przez jego lokalizację w bazie danych. W poprzednim przykładzie pokazano dokument alovelace
w kolekcji users
. Aby odwołać się do tej lokalizacji w swoim kodzie, możesz utworzyć do niej odwołanie .
Web version 9
import { doc } from "firebase/firestore"; const alovelaceDocumentRef = doc(db, 'users', 'alovelace');
Web version 8
var alovelaceDocumentRef = db.collection('users').doc('alovelace');
Szybki
let alovelaceDocumentRef = db.collection("users").document("alovelace")
Cel C
FIRDocumentReference *alovelaceDocumentRef = [[self.db collectionWithPath:@"users"] documentWithPath:@"alovelace"];
Java
DocumentReference alovelaceDocumentRef = db.collection("users").document("alovelace");
Kotlin+KTX
val alovelaceDocumentRef = db.collection("users").document("alovelace")
Dart
final alovelaceDocumentRef = db.collection("users").doc("alovelace");
Jawa
Pyton
Python
C++
DocumentReference alovelace_document_reference = db->Collection("users").Document("alovelace");
Node.js
Iść
PHP
$document = $db->collection('samples/php/users')->document('lovelace');
Jedność
DocumentReference documentRef = db.Collection("users").Document("alovelace");
C#
DocumentReference documentRef = db.Collection("users").Document("alovelace");
Rubin
Odwołanie to lekki obiekt, który po prostu wskazuje lokalizację w Twojej bazie danych. Możesz utworzyć odniesienie, niezależnie od tego, czy istnieją tam dane, a tworzenie odniesienia nie wykonuje żadnych operacji sieciowych.
Możesz również tworzyć odniesienia do kolekcji :
Web version 9
import { collection } from "firebase/firestore"; const usersCollectionRef = collection(db, 'users');
Web version 8
var usersCollectionRef = db.collection('users');
Szybki
let usersCollectionRef = db.collection("users")
Cel C
FIRCollectionReference *usersCollectionRef = [self.db collectionWithPath:@"users"];
Java
CollectionReference usersCollectionRef = db.collection("users");
Kotlin+KTX
val usersCollectionRef = db.collection("users")
Dart
final usersCollectionRef = db.collection("users");
Jawa
Pyton
Python
C++
CollectionReference users_collection_reference = db->Collection("users");
Node.js
Iść
PHP
$collection = $db->collection('samples/php/users');
Jedność
CollectionReference collectionRef = db.Collection("users");
C#
CollectionReference collectionRef = db.Collection("users");
Rubin
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ć odniesienie do dokumentu alovelace
:
Web version 9
import { doc } from "firebase/firestore"; const alovelaceDocumentRef = doc(db, 'users/alovelace');
Web version 8
var alovelaceDocumentRef = db.doc('users/alovelace');
Szybki
let aLovelaceDocumentReference = db.document("users/alovelace")
Cel C
FIRDocumentReference *aLovelaceDocumentReference = [self.db documentWithPath:@"users/alovelace"];
Java
DocumentReference alovelaceDocumentRef = db.document("users/alovelace");
Kotlin+KTX
val alovelaceDocumentRef = db.document("users/alovelace")
Dart
final aLovelaceDocRef = db.doc("users/alovelace");
Jawa
Pyton
Python
C++
DocumentReference alovelace_document = db->Document("users/alovelace");
Node.js
Iść
PHP
$document = $db->document('users/lovelace');
Jedność
DocumentReference documentRef = db.Document("users/alovelace");
C#
DocumentReference documentRef = db.Document("users/alovelace");
Rubin
Dane hierarchiczne
Aby zrozumieć, jak działają hierarchiczne struktury danych w Cloud Firestore, rozważ przykładową aplikację do czatu z wiadomościami i pokojami rozmów.
Możesz utworzyć kolekcję o nazwie rooms
, aby przechowywać różne pokoje rozmów:
name : "my chat room"
...
Teraz, gdy masz już 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 wiadomości w tym scenariuszu jest użycie kolekcji podrzędnych. 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
:
name : "my chat room"
wiadomość
from : "alex"
msg : "Hello World!"
wiadomość
...
...
W tym przykładzie utworzysz odwołanie do wiadomości w podkolekcji z następującym kodem:
Web version 9
import { doc } from "firebase/firestore"; const messageRef = doc(db, "rooms", "roomA", "messages", "message1");
Web version 8
var messageRef = db.collection('rooms').doc('roomA') .collection('messages').doc('message1');
Szybki
let messageRef = db .collection("rooms").document("roomA") .collection("messages").document("message1")
Cel C
FIRDocumentReference *messageRef = [[[[self.db collectionWithPath:@"rooms"] documentWithPath:@"roomA"] collectionWithPath:@"messages"] documentWithPath:@"message1"];
Java
DocumentReference messageRef = db .collection("rooms").document("roomA") .collection("messages").document("message1");
Kotlin+KTX
val messageRef = db .collection("rooms").document("roomA") .collection("messages").document("message1")
Dart
final messageRef = db .collection("rooms") .doc("roomA") .collection("messages") .doc("message1");
Jawa
Pyton
Python
C++
DocumentReference message_reference = db->Collection("rooms") .Document("roomA") .Collection("messages") .Document("message1");
Node.js
Iść
PHP
$document = $db ->collection('rooms') ->document('roomA') ->collection('messages') ->document('message1');
Jedność
DocumentReference documentRef = db .Collection("Rooms").Document("RoomA") .Collection("Messages").Document("Message1");
C#
DocumentReference documentRef = db .Collection("Rooms").Document("RoomA") .Collection("Messages").Document("Message1");
Rubin
Zwróć uwagę na naprzemienny wzór kolekcji i dokumentów. Twoje kolekcje i dokumenty muszą być zawsze zgodne z tym wzorcem. Nie można odwoływać się do kolekcji w kolekcji ani do dokumentu w dokumencie.
Kolekcje podrzędne umożliwiają hierarchiczną strukturę danych, ułatwiając dostęp do danych. Aby uzyskać wszystkie wiadomości w pokoju A , możesz utworzyć odwołanie do kolekcji do messages
z roomA
i wchodzić z nimi 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.