Cloud Firestore obsługuje używanie filtrów zakresów i nierówności w wielu polach w jednym zapytaniu. Możesz teraz wyświetlać zakres i warunki nierówności w wielu polach i upraszczają programowaniu aplikacji przez przekazanie implementacji logiki postfiltrowania do: i Cloud Firestore.
Filtry zakresów i nierówności w wielu polach
To zapytanie zwraca wszystkich użytkowników, których wiek wynosi większy niż 35, a wzrost wynosi od 60 do 70.
Modułowa wersja internetowa 9
const q = query(
collection(db, "users"),
where('age', '>', 35),
where('height', '>', 60),
where('height', '<', 70)
);
Swift
let query = db.collection("users")
.whereField("age", isGreaterThan: 35)
.whereField("height", isGreaterThan: 60)
.whereField("height", isLessThan: 70)
Objective-C
FIRQuery *query =
[[[[self.db collectionWithPath:@"users"]
queryWhereField:@"age" isGreaterThan:@35]
queryWhereField:@"height" isGreaterThan:@60]
queryWhereField:@"height" isLessThan:@70];
Android w Javie
Query query = db.collection("users")
.whereGreaterThan("age", 35)
.whereGreaterThan("height", 60)
.whereLessThan("height", 70);
Kotlin + KTX – Android
val query = db.collection("users")
.whereGreaterThan("age", 35)
.whereGreaterThan("height", 60)
.whereLessThan("height", 70)
Java
db.collection("users")
.whereGreaterThan("age", 35)
.whereGreaterThan("height", 60)
.whereLessThan("height", 70);
Node.js
db.collection("users")
.where('age', '>', 35),
.where('height', '>', 60),
.where('height', '<', 70)
Uwagi na temat indeksowania
Zanim zaczniesz wykonywać zapytania, przeczytaj zapytania i model danych Cloud Firestore.
W Cloud Firestore klauzula ORDER BY
zapytania określa, które indeksy
. Na przykład zapytanie ORDER BY a ASC, b ASC
wymaga indeksu złożonego w polach a ASC, b ASC
.
Aby zoptymalizować wydajność i koszty zapytań do Cloud Firestore, zoptymalizować kolejność pól w indeksie. W tym celu upewnij się, że indeks jest uporządkowany od lewej do tak, aby zapytanie było destylowane do zbioru danych, który uniemożliwia skanowanie nieistotne wpisy indeksu.
Załóżmy, że chcesz przeszukać zbiór pracowników i znaleźć
pracowników, których wynagrodzenie wynosi ponad 100 000 i ma wieloletnie doświadczenie
większy niż 0. Z Twojego zrozumienia zbioru danych wynika, że
ograniczenie zarobków jest bardziej selektywne niż ograniczenie doświadczenia. Idealna
który ograniczy liczbę skanowań indeksu,
(salary [...], experience [...])
Zatem zapytanie, które byłoby szybkie
o opłacalnej wartości zamówienia salary
przed experience
będzie wyglądać tak:
Java
db.collection("employees")
.whereGreaterThan("salary", 100000)
.whereGreaterThan("experience", 0)
.orderBy("salary")
.orderBy("experience");
Node.js
db.collection("employees")
.where("salary", ">", 100000)
.where("experience", ">", 0)
.orderBy("salary")
.orderBy("experience");
Python
db.collection("employees")
.where("salary", ">", 100000)
.where("experience", ">", 0)
.order_by("salary")
.order_by("experience");
Sprawdzone metody optymalizacji indeksów
Podczas optymalizowania indeksów stosuj te sprawdzone metody.
Uporządkuj pola indeksu według równości, po których następuje najbardziej selektywny zakres lub pole nierówności
Cloud Firestore używa skrajnych pól indeksu złożonego po lewej stronie, aby spełnić wymagania
ograniczenia równości oraz ograniczenie zakresu lub nierówności, jeśli występuje, w pierwszym polu
zapytania orderBy()
. Te ograniczenia mogą zmniejszyć liczbę indeksów
Wpisy skanowane przez Cloud Firestore. Cloud Firestore używa pozostałych pól
indeksu, aby spełnić inne ograniczenia dotyczące zakresu lub nierówności zapytania. Te
ograniczenia nie zmniejszają liczby wpisów indeksu skanowanych przez Cloud Firestore
ale odfiltrowuje niedopasowane dokumenty, by zmniejszyć ich liczbę
wraca do klienta.
Aby uzyskać więcej informacji na temat tworzenia wydajnych indeksów, zapoznaj się z definicją indeksu idealnego.
Uporządkuj pola w malejącej kolejności selektywności ograniczenia zapytania
Aby mieć pewność, że Cloud Firestore wybierze optymalny indeks dla Twojego zapytania,
określ klauzulę orderBy()
, która porządkuje pola w malejącej kolejności w zapytaniu
selektywność ograniczenia. Większa selektywność pasuje do mniejszego podzbioru
dokumentów. Mniejsza selektywność odpowiada większego podzbioru dokumentów. Upewnij się, że
wcześniej wybierasz pola zakresu lub nierówności o większej selektywności.
niż pola o mniejszej selektywności.
Aby zminimalizować liczbę dokumentów, które Cloud Firestore skanuje i zwraca Kolejność pól należy zawsze ułożyć w kolejności malejącej selektywność ograniczenia. Jeśli wyniki nie są ułożone w wymaganej kolejności, a zbiór wyników powinien być mały, możesz zaimplementować funkcje logiczne po stronie klienta, zmień ją zgodnie z oczekiwaniami.
Załóżmy, że chcesz przeszukać zbiór pracowników, aby znaleźć pracowników, których wynagrodzenie przekracza 100 000, i porządkuje wyniki według roku z doświadczeniem pracownika. Jeśli spodziewasz się, że tylko niewielka liczba pracowników otrzyma wynagrodzenie więcej niż 100 000, najwydajniejszym sposobem utworzenia zapytania jest następujący:
Java
db.collection("employees")
.whereGreaterThan("salary", 100000)
.orderBy("salary")
.get()
.addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
@Override
public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
// Order results by `experience`
}
});;
Node.js
const querySnapshot = await db.collection('employees')
.where("salary", ">", 100000)
.orderBy("salary")
.get();
// Order results by `experience`
Python
results = db.collection("employees")
.where("salary", ">", 100000)
.order_by("salary")
.stream()
// Order results by `experience`
Dodanie do zapytania kolejności w polu experience
spowoduje wyświetlenie tego samego zbioru
dokumentów i uniknąć zmiany kolejności wyników w klientach, zapytanie może
odczytuje znacznie więcej zbędnych wpisów indeksu niż wcześniejsze zapytanie. Dzieje się tak, ponieważ
Cloud Firestore zawsze preferuje indeks, którego prefiks pól indeksu pasuje do
kolejność według klauzuli zapytania. Jeśli do zamówienia dodano klauzulę experience
,
Cloud Firestore wybierze indeks (experience [...], salary [...])
.
do przetwarzania wyników zapytań. Ponieważ nie ma innych ograniczeń
experience
, Cloud Firestore będzie odczytywać wszystkie wpisy indeksu
employees
przed zastosowaniem filtra salary
w celu znalezienia ostatecznej wartości
wyniki. Oznacza to, że wpisy indeksu, które nie spełniają warunków salary
nadal są odczytywane, co zwiększa czas oczekiwania i koszty zapytania.
Ceny
Zapytania z filtrami zakresów i nierówności w wielu polach są rozliczane na podstawie odczytywanych dokumentów i wpisów indeksu.
Szczegółowe informacje znajdziesz na stronie Ceny.
Ograniczenia
Oprócz ograniczeń dotyczących zapytań pamiętaj o opisanych niżej ograniczeniach, za pomocą zapytań z filtrami zakresów i nierówności w wielu polach:
- Zapytania z filtrami zakresów lub nierówności w polach dokumentu i tylko o równości
ograniczenia dotyczące klucza dokumentu
(__name__)
nie są obsługiwane. - Cloud Firestore ogranicza liczbę pól zakresu lub nierówności do 10. Dzięki temu zapytania nie będą zbyt drogie do uruchomienia.
Co dalej
- Dowiedz się więcej o optymalizowaniu zapytań.
- Dowiedz się więcej o wykonywaniu zapytań prostych i złożonych.
- Dowiedz się, jak Cloud Firestore używa indeksów.