Przegląd zapytań z filtrami zakresów i nierówności w wielu polach

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