Firestore w trybie natywnym obejmuje 2 zestawy operacji: operacje Firestore Core i operacje Firestore Pipeline.
Operacje Firestore Core zapewniają standardowe funkcje tworzenia, odczytu, aktualizacji i usuwania dokumentów (CRUD) oraz wbudowaną obsługę zapytań nasłuchujących w czasie rzeczywistym i trwałości offline. Istotną różnicą operacyjną w tej wersji jest to, że indeksy są opcjonalne i nie są automatycznie tworzone dla pojedynczych pól. Umożliwia to wykonywanie zapytań bez wstępnej konfiguracji indeksu, ale zapytania nieindeksowane będą domyślnie skanować całą kolekcję. W miarę powiększania się zbioru danych może to prowadzić do wydłużenia czasu oczekiwania i wzrostu kosztów.
Operacje potoku Firestore to główna funkcja wersji Firestore Enterprise, oparta na zaawansowanym mechanizmie zapytań, która znacznie rozszerza zakres możliwych zapytań. Operacje potoku wykorzystują elastyczną składnię zapytań i odrębną metodę indeksowania, w której indeksy są opcjonalne i nie są tworzone automatycznie, co umożliwia zaawansowane operacje pobierania danych na potrzeby aplikacji.
Funkcje operacji Firestore Core
Operacje podstawowe umożliwiają standardowe operacje CRUD i zapytania nasłuchujące w czasie rzeczywistym. Jednak gdy używasz tych operacji w wersji Enterprise, podstawowe zachowanie dotyczące indeksowania i rozliczeń znacznie się różni od wersji Standard.
Funkcje i ciągłość działania
Podstawowe operacje zachowują znaną składnię łańcucha metod (np. .where(), .orderBy()) używaną w wersji Standard. Te operacje obsługują zapytania nasłuchujące w czasie rzeczywistym i trwałość offline w przypadku klientów mobilnych i internetowych. Zalecamy używanie tych operacji w przypadku standardowych zadań transakcyjnych, prostych operacji wyszukiwania i migracji istniejącego kodu aplikacji.
Indeksowanie niestandardowe
W przeciwieństwie do wersji Standard operacje Core w wersji Enterprise nie tworzą automatycznie indeksów jednopolowych. Indeksy są opcjonalne i nie są wymagane do wykonania zapytania. Jeśli brakuje określonego indeksu, zapytanie wykonuje pełne skanowanie kolekcji. Chociaż zapytania nieindeksowane umożliwiają szybkie prototypowanie, mogą działać wolniej i kosztować więcej w miarę wzrostu zbioru danych. Deweloperzy muszą ręcznie tworzyć indeksy, aby zoptymalizować wydajność zapytań i zmniejszyć zużycie jednostek odczytu.
Model rozliczeniowy (oparty na jednostkach)
Opłaty za jednostki odczytu są naliczane w transzach po 4 KB, a nie według liczby dokumentów. Niezindeksowane zapytanie skanujące dużą kolekcję będzie zużywać jednostki odczytu na podstawie łącznej liczby bajtów przeskanowanych we wszystkich dokumentach. Jednostki zapisu są rozliczane w transzach po 1 KB. Zapisanie dokumentu zużywa jednostki na dane oraz dodatkowe jednostki na każdy zaktualizowany wpis indeksu. W przeciwieństwie do wersji Standard, która wymusza automatyczne indeksowanie pojedynczych pól, możesz teraz wybrać konkretne pola do indeksowania, aby zoptymalizować koszty i wydajność zapisu.
Funkcje operacji potoku Firestore
Wersja Firestore Enterprise z operacjami potokowymi korzysta z zaawansowanego mechanizmu zapytań, który eliminuje wiele ograniczeń wersji Firestore Standard. Operacje potoku zapewniają setki dodatkowych funkcji zapytań. Operacje na potoku mają te możliwości:
Składnia kompozycyjna oparta na etapach
Zapytania dotyczące potoku są tworzone przez zdefiniowanie serii sekwencyjnych etapów, które są wykonywane w określonej kolejności. Umożliwia to wykonywanie złożonych operacji, takich jak filtrowanie wyniku agregacji, co wcześniej nie było możliwe.
Poniższy przykład pokazuje zapytanie dotyczące potoku, które znajduje liczbę unikalnych identyfikatorów produktów wyświetlonych w ostatnim miesiącu:
guard let cutoffDate = Calendar.current.date(byAdding: .month, value: -1, to: Date()) else {
return
}
let snapshot = try await db.pipeline()
.collection("productViews")
.where(Field("viewedAt").greaterThan(cutoffDate.timeIntervalSince1970))
.aggregate([Field("productId").countDistinct().as("uniqueProductViews")])
.execute()
Rozszerzone możliwości
Zapytanie potoku wprowadza wiele nowych funkcji, takich jak:
- Agregacje: obsługa nowych funkcji agregujących (takich jak
sum(...),min(...)icount_distinct(...)) w połączeniu z dowolnymi polami grupowania. - Złączenia relacyjne: wykonuj złączenia po stronie serwera w kolekcjach i podkolekcjach za pomocą skorelowanych podzapytań.
- Złożone filtrowanie: obsługa setek dodatkowych funkcji umożliwiających wyrażanie dowolnie złożonych instrukcji
where(...), w tymregex_match(...),add(...)istr_contains(...), bez konieczności stosowania rygorystycznych wymagań dotyczących indeksów. - Częściowe odczyty / projekcje: pobieraj dynamiczne podzbiory dokumentów za pomocą
select(...),remove_fields(...)i wielu innych etapów manipulowania dokumentami.
Więcej informacji o tych możliwościach znajdziesz w artykule Wykonywanie zapytań na danych za pomocą operacji potoku.
Obsługa w czasie rzeczywistym i offline
Aby korzystać z funkcji czasu rzeczywistego i trybu offline, deweloperzy mogą używać podstawowych operacji Firestore w wersji Firestore Enterprise.
Integracja klienta i narzędzi
Wersja Enterprise zawiera specjalne funkcje do interakcji z zapytaniami potoku i zarządzania nimi:
- Wyjaśnianie i profilowanie zapytań: możesz użyć wyników wyjaśniania zapytań, aby dowiedzieć się, ile jednostek odczytu lub zapisu zużywa zapytanie, i przeanalizować jego wykonanie.
- Statystyki zapytań: wersja Enterprise obsługuje statystyki zapytań, które pomagają określić, gdzie można utworzyć indeksy, aby zwiększyć wydajność i obniżyć koszty. Statystyki zapytań zapewniają wgląd w najpopularniejsze zapytania uruchamiane w bazie danych i ich charakterystykę wydajności.
- Nowe typy indeksów: w wersji Enterprise możesz tworzyć specjalistyczne indeksy, w tym indeksy rozproszone, nierozproszone i unikalne. Obsługuje też tworzenie i edytowanie indeksów wyszukiwania wektorowego w bazach danych Enterprise.
Różnice między Firestore Standard a Firestore Enterprise
Główna różnica operacyjna między operacjami podstawowymi a operacjami potoku polega na zarządzaniu indeksowaniem, co bezpośrednio wpływa na wydajność i koszty.
| Wersja Standard – podstawowe operacje | Wersja Enterprise – operacje podstawowe i operacje potoku | |
| Wymagania dotyczące indeksowania | Indeksy są wymagane w przypadku zapytań.
Indeksy dla poszczególnych pól są tworzone automatycznie, natomiast bardziej złożone zapytania korzystają z indeksów złożonych lub indeksów grup kolekcji, które trzeba skonfigurować ręcznie. |
Indeksy nie są wymagane, więc są opcjonalne w przypadku zapytań.
Indeksy definiujesz w miarę potrzeb. Wersja Enterprise obsługuje też szerszy zakres typów indeksów, w tym indeksy nierozproszone/rozproszone i unikalne. |
| Zindeksowane pola | Jeśli nie ma jeszcze dodatkowego pola __name__, jest ono automatycznie dołączane do indeksowanych pól. | __name__ nie jest automatycznie dołączany do indeksowanych pól. Jeśli jest to ważne dla Twojej aplikacji, musisz wyraźnie określić __name__ w indeksowanych polach. |
| Normalizacja kolejności sortowania | Klauzula order by zapytania jest normalizowana przez dołączenie na końcu pól nierówności i pola __name__ (jeśli jeszcze nie występują). Gwarantuje to unikalne, deterministyczne uporządkowanie wyników niezależnie od tego, jakie inne pola znajdują się w klauzuli order by. | Brak normalizacji kolejności sortowania. Kolejność sortowania, np. sort a ASC, gwarantuje tylko, że wyniki są sortowane według pola a. Cloud Firestore będzie używać istniejących indeksów, aby zwracać wyniki w najbardziej efektywnej kolejności. Dlatego jeśli a nie jest unikalne w zbiorze wyników, kolejność wyników może się różnić w zależności od konfiguracji indeksu, strategii wykonywania itp. Aby zagwarantować unikalną, deterministyczną kolejność wyników, musisz dodać do kolejności sortowania unikalne pole, takie jak __name__. |
| Wyniki | Zapytania indeksowane: wydajność i koszty skalują się wraz z rozmiarem zbioru wyników. |
Zapytania nieindeksowane: wydajność i koszty zależą od rozmiaru zbioru danych. Zapytania indeksowane: wydajność i koszty skalują się wraz z rozmiarem zbioru wyników. Zalecamy korzystanie z narzędzi Wyjaśnienie zapytania i Statystyki zapytań, aby tworzyć indeksy oraz zwiększać wydajność i obniżać koszty zapytań. |
| Wpływ na koszty przechowywania | Indeksy automatyczne i złożone powodują dodatkowe obciążenie pamięci. | Oszczędzasz na kosztach miejsca na dane, ponieważ indeksy nie są tworzone automatycznie dla każdego pola. |
| Baza kosztu | Opłata jest naliczana za każdą operację odczytu, zapisu i usunięcia dokumentu. | Opłaty są naliczane za jednostkę odczytu (transze 4 KB) i jednostkę zapisu (transze 1 KB). Zapisywanie wpisów indeksu zużywa jednostki zapisu.
Dowiedz się więcej o nowych cenach na podstawie przykładów. |
| Reguły zabezpieczeń | Reguły zabezpieczeń chronią kolekcje, weryfikując uprawnienia do odczytu i zapisu. | Reguły zabezpieczeń chronią kolekcje, weryfikując uprawnienia do odczytu i zapisu. Dowiedz się, jak modelować dane, aby obsługiwać zapytania dotyczące potoku, w przewodniku Model danych. |