Cloud Firestore jest elastyczną, skalowalną, hierarchiczną bazą danych NoSQL w chmurze służącą do przechowywania i synchronizowania w czasie rzeczywistym danych między klientami i serwerem. Oferuje wsparcie w trybie offline co ułatwia budowania responsywnych aplikacji działających niezależnie od jakości połączenia sieciowego. Umożliwia integracje z Google Cloud Platform i funkcjonalnościami Firebase jak np. Cloud Functions czy Authentication oraz innymi zewnętrznymi usługami. Dostęp i modyfikacja danych odbywa się zgodnie z zasadami zachowania bezpieczeństwa i prywatności, które mogą być dodatkowo definiowane za pomocą reguł w konsoli Firebase.
Model
Dane reprezentowane są w postaci dokumentów (zbliżonych w stukurze do formatu JSON) przechowywanych w zorganizowanej kolekcji w hierarchicznej strukturze bazy danych NoSQL (w przeciwieństwie do SQL nie ma tabel ani wierszy). Każdy dokument (document) składa się z nazwy, zbioru par klucz - wartość (prymityw lub obiekt złożony) i może posiadać obiekty zagnieżdzone i podkolekcje. Kolekcje (collection) pełnią rolę kontenera dla różnych dokumentów i nie mogą posiadać innych kolekcji, a w doborze ich zawartości warto zachować logiczny porządek dzieląc dokumenty ze względu na kategorie i przeznaczenie co upraszcza poruszanie się po strukturze w kodzie klienta. Podkolekcja jest kolekcją w dokumencie i służy do budowania zagnieżdzonej struktury folderów.
Ze względu na optymalizacje wydajności dostępu do bazy danych wprowadzony został mechanizm indeksowania, który wyróżnia dwa rodzaje indeksów: single-field (przechowuje posortowaną mapę wszystkich dokumentów zawierających dane pole) i composite (przechowuje posortowaną mapę wszystkich dokumentów zawierających wiele danych pól). Cloud Firestore jest zaprojektowany przede wszystkim z myślą o dużych kolekcjach małych dokumentów. Aby uzyskać dostęp do dokumentu lub kolekcji należy uzyskać referencje - obiekt typu DocumentReference.
Typy
Dokumenty mogą przechowywać wartości prymitywów (numeryczne, logiczne, tekstowe), obiekty złożone (koordynaty geograficzne, data i czas), tablice, mapy i referencje do innych dokumentów.
Zapis
Aby dokonać zapisu w Cloud Firestore należy podać identyfikator dokumentu oraz przekazać obiekt danych metodą set lub w przypadku automatycznego generowania id wystarczy tylko przekazać danę metodą add. Jeśli dokument nie istnieje wówczas zostanie utworzy, w przeciwnym razie jego zawartośc zostanie nadpisana, chyba że zostaną użyte odpowiednie opcje. Dodanie obserwatorów umożliwia śledzenie stanu operacji.
W celu aktualizacji wybranych pól dokumentu bez nadpisywania całej jego zawartości należy użyć metodę update na referencji. Odwołując się do obiektów zagnieżdzonych należy wykorzystać właściwą notację oddzielając pola i wartości przecinkiem, a w przypadku modyfikacji elementów tablic użyć metod FieldValue.arrayUnion oraz FieldValue.arrayRemove.
Usunięcie dokumentu następuje poprzez wywołanie metody delete na referencji dokumentu (nie powoduje usunięcia jego podkolekcji), natomiast przypisanie wartości FieldValue.delete() do pola w operacji update powoduje jego usunięcie. Usuwanie całych kolekcji po stronie klient jest niezalecane ze względu na zagrożenia wydajności, wycieku pamięci, bezpieczeńśtwa po stronie klienta wynikające z potrzeby wysyłania wielu żądań.
Odczyt
Pobieranie dokumentów odbywa się przez wywołanie metody get na referencji dokumentu lub kolekcji. Dodatkowo można ustawić źródło pobierania danych na serwer lub pamięć cache oraz parsować otrzymane dane do instancji klasy. Rozszerzenie żądania o żłożone zapytania pozwala filtrowanie (where), sortowanie (orderBy) i ograniczanie liczby wyników spełniających założenia (limit).
Ponadto istnieje możliwość nasłuchiwania modyfikacji danych dla dokumentu i kolekcji w czasie rzeczywistym poprzez dodanie obiektu słuchacza z uwzględnieniem źródła i typu zmian.
Transakcje
Cloud Firestore wspiera atomowe operacje dla zapisu i odczytu, które są implikowane tylko wtedy kiedy wszystkie operacje zbioru zakończą się pozytywnie, zatem wykonanie zbioru operacji atomowych jest spójne i nierozdzielne. Wyróżnia się dwa typy operacji atomowych: transakcje (transaction) - zbiór operacji odczytu i zapisu na wielu dokumentach oraz zestaw zapisu (batched write) - zbiór operacji zapisu dla wielu dokumentów. Transakcje pozwalają na grupowanie wielu operacji w jedną transakcje i wykorzystywane są przede wszystkim do modyfikacji dokumentów bazując na ich bieżącym stanie. Wykonywane są za pomocą metody runTransaction lub zbioru operacji zapisu na obiekcie WriteBatch.