Zarządzaj indeksami w Cloud Firestore

Cloud Firestore zapewnia wydajność zapytań, wymagając indeksu dla każdego zapytania. Indeksy wymagane dla najbardziej podstawowych zapytań są tworzone automatycznie . Podczas korzystania i testowania aplikacji Cloud Firestore generuje komunikaty o błędach, które pomagają utworzyć dodatkowe indeksy wymagane przez aplikację. Na tej stronie opisano sposób zarządzania indeksami jednopolowymi i złożonymi .

Utwórz brakujący indeks, wyświetlając komunikat o błędzie

Jeśli spróbujesz wykonać zapytanie złożone z klauzulą ​​zakresu, która nie jest odwzorowana na istniejący indeks, pojawi się błąd. Komunikat o błędzie zawiera bezpośredni link do utworzenia brakującego indeksu w konsoli Firebase.

Kliknij wygenerowany link do konsoli Firebase, przejrzyj automatycznie wypełnione informacje i kliknij Utwórz .

Role i uprawnienia

Zanim będziesz mógł utworzyć indeks w Cloud Firestore, upewnij się, że masz przypisaną jedną z następujących ról:

  • roles/datastore.owner
  • roles/datastore.indexAdmin
  • roles/editor
  • roles/owner

Jeśli zdefiniowałeś role niestandardowe, przypisz wszystkie poniższe uprawnienia do tworzenia indeksów:

  • datastore.indexes.create
  • datastore.indexes.delete
  • datastore.indexes.get
  • datastore.indexes.list
  • datastore.indexes.update

Użyj konsoli Firebase

Aby ręcznie utworzyć nowy indeks z konsoli Firebase:

obraz interfejsu indeksowania Firestore w konsoli Firebase

  1. Przejdź do sekcji Cloud Firestore w konsoli Firebase .
  2. Przejdź do zakładki Indeksy i kliknij Dodaj indeks .
  3. Wpisz nazwę kolekcji i ustaw pola, według których chcesz uporządkować indeks.
  4. Kliknij opcję Utwórz .

Pola indeksowe muszą być zgodne z ograniczeniami dotyczącymi ścieżek pól .

Tworzenie indeksów może zająć kilka minut, w zależności od rozmiaru zapytania. Po ich utworzeniu możesz zobaczyć swoje indeksy i ich status w sekcji Indeksy złożone. Jeśli nadal budują, konsola Firebase zawiera pasek stanu budowania.

Usuń indeksy

Aby usunąć indeks:

  1. Przejdź do sekcji Cloud Firestore w konsoli Firebase .
  2. Kliknij zakładkę Indeksy .
  3. Najedź kursorem na indeks, który chcesz usunąć i wybierz Usuń z menu kontekstowego.
  4. Potwierdź, że chcesz go usunąć, klikając Usuń z alertu.

Użyj interfejsu wiersza polecenia Firebase

Możesz także wdrażać indeksy za pomocą interfejsu wiersza polecenia Firebase . Aby rozpocząć, uruchom firebase init firestore w katalogu projektu. Podczas instalacji interfejs CLI Firebase generuje plik JSON z domyślnymi indeksami w odpowiednim formacie. Edytuj plik, aby dodać więcej indeksów i wdróż go za pomocą polecenia firebase deploy .

Aby wdrożyć tylko indeksy i reguły Cloud Firestore, dodaj flagę --only firestore .

Jeśli edytujesz indeksy za pomocą konsoli Firebase, pamiętaj o zaktualizowaniu także lokalnego pliku indeksów. Zapoznaj się z dokumentacją dotyczącą definicji indeksu JSON .

Użyj Terraforma

Tworzenie indeksów w bazie danych

Baza danych Cloud Firestore może zawierać indeks jednopolowy lub indeks złożony. Możesz edytować plik konfiguracyjny Terraform, aby utworzyć indeks dla swojej bazy danych.

Indeks jednopolowy

Poniższy przykładowy plik konfiguracyjny Terraform tworzy indeks jednopolowy w polu name w kolekcji chatrooms :

Firestore.tf

resource "random_id" "variable"{
  byte_length = 8
}

resource "google_firestore_field" "single-index" {
  project = "project-id"
  database = "database-id"
  collection = "chatrooms_${random_id.variable.hex}"
  field = "name"

  index_config {
    indexes {
        order = "ASCENDING"
        query_scope = "COLLECTION_GROUP"
    }
    indexes {
        array_config = "CONTAINS"
    }
  }

  ttl_config {}
}
  • Zastąp project-id identyfikatorem projektu. Identyfikatory projektów muszą być unikalne.
  • Zastąp database-id identyfikatorem bazy danych.

Indeks złożony

Poniższy przykładowy plik konfiguracyjny Terraform tworzy indeks złożony dla kombinacji pola name i pola description w kolekcji chatrooms :

Firestore.tf

resource "google_firestore_index" "composite-index" {
  project = "project-id"
  database = "database-id"

  collection = "chatrooms"

  fields {
    field_path = "name"
    order      = "ASCENDING"
  }

  fields {
    field_path = "description"
    order      = "DESCENDING"
  }

}
  • Zastąp project-id identyfikatorem projektu. Identyfikatory projektów muszą być unikalne.
  • Zastąp database-id identyfikatorem bazy danych.

Czas tworzenia indeksu

Aby zbudować indeks, Cloud Firestore musi go skonfigurować, a następnie wypełnić indeks istniejącymi danymi. Czas tworzenia indeksu to suma czasu konfiguracji i czasu uzupełniania:

  • Konfiguracja indeksu zajmuje kilka minut. Minimalny czas kompilacji indeksu to kilka minut, nawet w przypadku pustej bazy danych.

  • Czas uzupełniania zależy od tego, ile istniejących danych należy do nowego indeksu. Im więcej wartości pól pasuje do definicji indeksu, tym dłużej trwa uzupełnianie indeksu.

Kompilacje indeksów są operacjami długotrwałymi .

Po rozpoczęciu tworzenia indeksu Cloud Firestore przypisuje operacji unikalną nazwę. Nazwy operacji są poprzedzone przedrostkiem projects/[PROJECT_ID]/databases/(default)/operations/ , na przykład:

projects/project-id/databases/(default)/operations/ASA1MTAwNDQxNAgadGx1YWZlZAcSeWx0aGdpbi1zYm9qLW5pbWRhEgopEg

Można jednak pominąć przedrostek, określając nazwę operacji dla polecenia describe .

Lista wszystkich długotrwałych operacji

Aby wyświetlić listę długotrwałych operacji, użyj polecenia listy operacji gcloud firestore . To polecenie wyświetla listę trwających i ostatnio zakończonych operacji. Operacje są wymienione przez kilka dni po zakończeniu:

gcloud firestore operations list

Sprawdź stan działania

Zamiast wyświetlać listę wszystkich długotrwałych operacji, możesz wyświetlić szczegóły pojedynczej operacji:

gcloud firestore operations describe operation-name

Szacowanie czasu realizacji

Podczas wykonywania operacji sprawdź wartość pola state , aby poznać ogólny stan operacji.

Żądanie dotyczące stanu długotrwałej operacji zwraca również metryki workEstimated i workCompleted . Metryki te są zwracane dla liczby dokumentów. workEstimated pokazuje szacunkową całkowitą liczbę dokumentów przetworzonych przez operację. workCompleted pokazuje liczbę przetworzonych dotychczas dokumentów. Po zakończeniu operacji workCompleted odzwierciedla całkowitą liczbę faktycznie przetworzonych dokumentów, która może różnić się od wartości workEstimated .

Podziel workCompleted przez workEstimated w celu przybliżonego oszacowania postępu. Oszacowanie może być niedokładne, ponieważ zależy od opóźnionego gromadzenia statystyk.

Oto na przykład stan postępu kompilacji indeksu:

{
  "operations": [
    {
      "name": "projects/project-id/operations/AyAyMDBiM2U5NTgwZDAtZGIyYi0zYjc0LTIzYWEtZjg1ZGdWFmZWQHEjF0c2Flc3UtcmV4ZWRuaS1uaW1kYRUKSBI",
      "metadata": {
        "@type": "type.googleapis.com/google.firestore.admin.v1.IndexOperationMetadata",
        "common": {
          "operationType": "CREATE_INDEX",
          "startTime": "2020-06-23T16:52:25.697539Z",
          "state": "PROCESSING"
        },
        "progressDocuments": {
          "workCompleted": "219327",
          "workEstimated": "2198182"
        }
       },
    },
    ...

Po zakończeniu operacji opis operacji będzie zawierał "done": true . Zobacz wartość pola state , aby uzyskać wynik operacji. Jeżeli w odpowiedzi nie jest ustawione pole done , to jego wartość wynosi false . Nie polegaj na istnieniu wartości done dla operacji w toku.

Błędy w budowaniu indeksu

Podczas zarządzania indeksami złożonymi i wykluczeniami indeksów jednopolowych mogą wystąpić błędy podczas tworzenia indeksu. Operacja indeksowania może się nie powieść, jeśli Cloud Firestore napotka problem z indeksowanymi danymi. Najczęściej oznacza to osiągnięcie limitu indeksu . Na przykład operacja mogła osiągnąć maksymalną liczbę wpisów indeksu na dokument.

Jeśli utworzenie indeksu nie powiedzie się, w konsoli zostanie wyświetlony komunikat o błędzie. Po sprawdzeniu, że nie przekraczasz żadnych limitów indeksu , spróbuj ponownie wykonać operację indeksowania.