Zarządzanie indeksami w Cloud Firestore

Cloud Firestore zapewnia wydajność zapytań, wymagając indeksu dla każdego zapytania. Indeksy wymagane do najbardziej podstawowych zapytań są automatycznie utworzone dla Ciebie. Gdy używasz i testujesz swoją aplikację, Cloud Firestore generuje komunikaty o błędach, które pomagają tworzyć dodatkowe indeksy wymaga aplikacji. Na tej stronie dowiesz się, jak zarządzać kontem w indeksach z jednym polem i złożonym.

Tworzenie brakującego indeksu z powodu komunikatu o błędzie

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

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

Role i uprawnienia

Zanim utworzysz indeks w Cloud Firestore, upewnij się, że masz jedną z tych ról:

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

Jeśli masz zdefiniowane role niestandardowe, przypisz wszystkie z tych uprawnień, aby tworzyć indeksy:

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

Korzystanie z konsoli Firebase

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

obraz
interfejs indeksowania Firestore w konsoli Firebase.

  1. Otwórz sekcję Cloud Firestorekonsoli Firebase.
  2. Otwórz kartę Indeksy i kliknij Dodaj indeks.
  3. Wpisz nazwę zbioru i ustaw pola, według których chcesz uporządkować indeks.
  4. Kliknij Utwórz.

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

W zależności od rozmiaru zapytania kompilowanie indeksów może potrwać kilka minut. Po utworzeniu indeksów możesz je zobaczyć w Indeksy złożone. Jeśli są one nadal tworzone, w konsoli Firebase będzie widoczny pasek stanu.

Usuwanie indeksów

Aby usunąć indeks:

  1. Otwórz sekcję Cloud Firestore w konsoli Firebase.
  2. Kliknij kartę Indeksy.
  3. Najedź kursorem na indeks, który chcesz usunąć, i wybierz Usuń z menu kontekstowego.
  4. Aby potwierdzić, że chcesz go usunąć, w alercie kliknij Usuń.

Korzystanie z wiersza poleceń Firebase

Możesz też wdrażać indeksy za pomocą interfejsu wiersza poleceń Firebase. Zacznij od uruchomienia firebase init firestore w katalogu projektu. Podczas konfiguracji interfejs wiersza poleceń Firebase generuje plik JSON z domyślną wartością dla indeksów w prawidłowym formacie. Edytuj plik, aby dodać więcej indeksów i wdrożyć go za pomocą polecenia firebase deploy.

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

Jeśli wprowadzisz zmiany w indeksach za pomocą konsoli Firebase, pamiętaj o zaktualizowaniu pliku indeksów lokalnych. Więcej informacji: dokumentację definicji indeksu JSON.

Użyj Terraform

tworzenie indeksów w bazie danych.

Bazy danych Cloud Firestore mogą zawierać zarówno indeksy z jednym polem, jak i złożone. Możesz zmodyfikować plik konfiguracji Terraform, aby utworzyć indeks dla bazy danych. Indeksy z jednym polem i złożone używają różnych typów zasobów Terraform.

Indeks jednego pola

Ten przykładowy plik konfiguracji Terraform tworzy indeks z jednym polem 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

Ten przykładowy plik konfiguracji Terraform tworzy indeks złożony dla kombinacji pól name i 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 kompilacji indeksu

Aby utworzyć indeks, Cloud Firestore musi skonfigurować indeks, a następnie uzupełnić indeks dotychczasowymi danymi. Czas kompilacji indeksu to suma czasu konfiguracji i czas uzupełniania:

  • Konfigurowanie indeksu może potrwać kilka minut. Minimalna kompilacja czas indeksowania 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 indeksu to długo trwające operacje.

Po rozpoczęciu kompilacji indeksu usługa Cloud Firestore nada operacji unikalną nazwę. Nazwy operacji mają prefiks projects/[PROJECT_ID]/databases/(default)/operations/, np.:

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

Możesz jednak pominąć ten prefiks podczas określania nazwy operacji dla polecenie describe.

Wyświetlam listę wszystkich długo trwających operacji

Aby wyświetlić listę długo trwających operacji, użyj lista operacji gcloud Firestore . To polecenie zawiera listę bieżących i niedawno zakończonych operacji. Operacje są wyświetlane przez kilka dni po ich zakończeniu:

gcloud firestore operations list

Sprawdź stan operacji

Zamiast podawać wszystkie długotrwałe operacje, możesz podać szczegóły w jednej operacji:

gcloud firestore operations describe operation-name

Szacowanie czasu ukończenia

W trakcie wykonywania operacji sprawdzaj wartość pola state ogólny stan operacji.

Żądanie dotyczące stanu długo trwającej operacji również zwraca wskaźniki workEstimated i workCompleted. Te dane są zwracane w przypadku liczby dokumentów. workEstimated pokazuje szacunkową łączną liczbę dokumentów . workCompleted pokazuje liczbę przetworzonych dokumentów do tej pory. Po jej zakończeniu workCompleted odzwierciedla łączną liczbę dokumentów, które zostały aktualnie przetworzono, co może się różnić od wartości workEstimated.

Aby uzyskać przybliżone oszacowanie postępu, podziel workCompleted przez workEstimated. Szacowana wartość może być niedokładna, ponieważ zależy od opóźnionego zbierania 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 jej opis zawiera "done": true. Sprawdź wartość w polu state dla: wyniku operacji. Jeśli w odpowiedzi pole done nie jest ustawione, to jego wartość wynosi false. Nie polegaj na istnieniu wartości done w przypadku operacji w toku.

Błędy tworzenia indeksu

Podczas zarządzania indeksami złożonymi i wykluczenia indeksu pojedynczego pola. Operacja indeksowania może się nie udać, jeśli Cloud Firestore napotka problem z indeksowanymi danymi. Większość często oznacza to, że trafisz na limit indeksu. Dla: na przykład operacja mogła osiągnąć maksymalną liczbę wpisów indeksu na dokument.

Jeśli nie uda się utworzyć indeksu, w konsoli zobaczysz komunikat o błędzie. Po Upewnij się, że nie trafisz żadnych limity indeksowania, spróbuj wykonać operację indeksowania ponownie.