Verwalten Sie Indizes im Cloud Firestore

Cloud Firestore stellt die Abfrageleistung sicher, indem für jede Abfrage ein Index erforderlich ist. Die für die grundlegendsten Abfragen erforderlichen Indizes werden automatisch für Sie erstellt . Während Sie Ihre App verwenden und testen, generiert Cloud Firestore Fehlermeldungen, die Ihnen bei der Erstellung zusätzlicher Indizes helfen, die Ihre App benötigt. Auf dieser Seite wird beschrieben, wie Sie Ihre Einzelfeld- und zusammengesetzten Indizes verwalten.

Erstellen Sie einen fehlenden Index durch eine Fehlermeldung

Wenn Sie versuchen, eine zusammengesetzte Abfrage mit einer Bereichsklausel durchzuführen, die keinem vorhandenen Index zugeordnet ist, erhalten Sie eine Fehlermeldung. Die Fehlermeldung enthält einen direkten Link zum Erstellen des fehlenden Index in der Firebase-Konsole.

Folgen Sie dem generierten Link zur Firebase-Konsole, überprüfen Sie die automatisch ausgefüllten Informationen und klicken Sie auf Erstellen .

Rollen und Berechtigungen

Bevor Sie einen Index in Cloud Firestore erstellen können, stellen Sie sicher, dass Ihnen eine der folgenden Rollen zugewiesen ist:

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

Wenn Sie benutzerdefinierte Rollen definiert haben, weisen Sie alle folgenden Berechtigungen zum Erstellen von Indizes zu:

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

Verwenden Sie die Firebase-Konsole

So erstellen Sie manuell einen neuen Index über die Firebase-Konsole:

Bild der Firestore-Indizierungsschnittstelle in der Firebase-Konsole

  1. Gehen Sie zum Abschnitt „Cloud Firestore“ der Firebase-Konsole .
  2. Gehen Sie zur Registerkarte „Indizes“ und klicken Sie auf „Index hinzufügen“ .
  3. Geben Sie den Sammlungsnamen ein und legen Sie die Felder fest, nach denen der Index sortiert werden soll.
  4. Klicken Sie auf Erstellen .

Indexfelder müssen den Einschränkungen für Feldpfade entsprechen.

Die Erstellung von Indizes kann je nach Größe der Abfrage einige Minuten dauern. Nachdem Sie sie erstellt haben, können Sie Ihre Indizes und ihren Status im Abschnitt „Zusammengesetzte Indizes“ sehen. Wenn sie noch bauen, enthält die Firebase-Konsole eine Gebäudestatusleiste.

Indizes entfernen

So löschen Sie einen Index:

  1. Gehen Sie zum Abschnitt „Cloud Firestore“ der Firebase-Konsole .
  2. Klicken Sie auf die Registerkarte Indizes .
  3. Bewegen Sie den Mauszeiger über den Index, den Sie löschen möchten, und wählen Sie im Kontextmenü „Löschen“ aus.
  4. Bestätigen Sie, dass Sie es löschen möchten, indem Sie in der Warnung auf Löschen klicken.

Verwenden Sie die Firebase-CLI

Sie können Indizes auch mit der Firebase-CLI bereitstellen. Führen Sie zunächst firebase init firestore in Ihrem Projektverzeichnis aus. Während der Einrichtung generiert die Firebase-CLI eine JSON-Datei mit den Standardindizes im richtigen Format. Bearbeiten Sie die Datei, um weitere Indizes hinzuzufügen, und stellen Sie sie mit dem firebase deploy -Befehl bereit.

Um nur Cloud Firestore-Indizes und -Regeln bereitzustellen, fügen Sie das Flag --only firestore hinzu.

Wenn Sie mit der Firebase-Konsole Änderungen an den Indizes vornehmen, stellen Sie sicher, dass Sie auch Ihre lokale Indexdatei aktualisieren. Weitere Informationen finden Sie in der Referenz zur JSON-Indexdefinition .

Verwenden Sie Terraform

Indizes in der Datenbank erstellen

Die Cloud Firestore-Datenbank kann einen Einzelfeldindex oder einen zusammengesetzten Index enthalten. Sie können die Terraform-Konfigurationsdatei bearbeiten, um einen Index für Ihre Datenbank zu erstellen.

Einzelfeldindex

Die folgende Beispiel-Terraform-Konfigurationsdatei erstellt einen Einzelfeldindex für das name in der chatrooms Sammlung:

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 {}
}
  • Ersetzen Sie project-id durch Ihre Projekt-ID. Projekt-IDs müssen eindeutig sein.
  • Ersetzen Sie database-id durch Ihre Datenbank-ID.

Composite-Index

Die folgende Beispiel-Terraform-Konfigurationsdatei erstellt einen zusammengesetzten Index für eine Kombination aus dem name und dem description in der chatrooms Sammlung:

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"
  }

}
  • Ersetzen Sie project-id durch Ihre Projekt-ID. Projekt-IDs müssen eindeutig sein.
  • Ersetzen Sie database-id durch Ihre Datenbank-ID.

Indexerstellungszeit

Um einen Index zu erstellen, muss Cloud Firestore den Index einrichten und ihn dann mit vorhandenen Daten auffüllen. Die Indexerstellungszeit ist die Summe aus Einrichtungszeit und Backfill-Zeit:

  • Das Einrichten eines Index dauert einige Minuten. Die minimale Erstellungszeit für einen Index beträgt einige Minuten, selbst für eine leere Datenbank.

  • Die Backfill-Zeit hängt davon ab, wie viele vorhandene Daten in den neuen Index gehören. Je mehr Feldwerte mit der Indexdefinition übereinstimmen, desto länger dauert das Auffüllen des Index.

Indexerstellungen sind Vorgänge mit langer Laufzeit .

Nachdem Sie eine Indexerstellung gestartet haben, weist Cloud Firestore dem Vorgang einen eindeutigen Namen zu. Den Operationsnamen wird das Präfix projects/[PROJECT_ID]/databases/(default)/operations/ vorangestellt, zum Beispiel:

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

Sie können das Präfix jedoch weglassen, wenn Sie einen Operationsnamen für den describe angeben.

Auflistung aller lang andauernden Vorgänge

Um lang laufende Vorgänge aufzulisten, verwenden Sie den Befehl gcloud firestore Operations list . Dieser Befehl listet laufende und kürzlich abgeschlossene Vorgänge auf. Die Vorgänge werden für einige Tage nach Abschluss aufgeführt:

gcloud firestore operations list

Überprüfen Sie den Betriebsstatus

Anstatt alle Vorgänge mit langer Laufzeit aufzulisten, können Sie die Details eines einzelnen Vorgangs auflisten:

gcloud firestore operations describe operation-name

Schätzung der Fertigstellungszeit

Sehen Sie sich während der Ausführung Ihres Vorgangs den Wert des state an, um den Gesamtstatus des Vorgangs zu ermitteln.

Eine Anfrage nach dem Status eines lang andauernden Vorgangs gibt auch die Metriken workEstimated und workCompleted zurück. Diese Metriken werden für die Anzahl der Dokumente zurückgegeben. workEstimated zeigt die geschätzte Gesamtzahl der Dokumente an, die ein Vorgang verarbeiten wird. workCompleted zeigt die Anzahl der bisher verarbeiteten Dokumente. Nach Abschluss des Vorgangs spiegelt workCompleted die Gesamtzahl der tatsächlich verarbeiteten Dokumente wider, die möglicherweise vom Wert von workEstimated abweichen.

Für eine grobe Fortschrittsschätzung teilen Sie workCompleted durch workEstimated auf. Die Schätzung ist möglicherweise ungenau, da sie von einer verzögerten Statistikerfassung abhängt.

Hier ist beispielsweise der Fortschrittsstatus einer Indexerstellung:

{
  "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"
        }
       },
    },
    ...

Wenn eine Operation abgeschlossen ist, enthält die Operationsbeschreibung "done": true . Das Ergebnis der Operation finden Sie im Wert des state . Wenn das Feld done in der Antwort nicht festgelegt ist, ist sein Wert false . Verlassen Sie sich bei laufenden Vorgängen nicht auf die Existenz des done Werts.

Fehler bei der Indexerstellung

Bei der Verwaltung zusammengesetzter Indizes und Einzelfeld-Indexausnahmen können Fehler bei der Indexerstellung auftreten. Ein Indizierungsvorgang kann fehlschlagen, wenn Cloud Firestore ein Problem mit den indizierten Daten feststellt. In den meisten Fällen bedeutet dies, dass Sie ein Indexlimit erreicht haben. Beispielsweise könnte der Vorgang die maximale Anzahl an Indexeinträgen pro Dokument erreicht haben.

Wenn die Indexerstellung fehlschlägt, wird die Fehlermeldung in der Konsole angezeigt. Nachdem Sie sichergestellt haben, dass Sie keine Indexgrenzen erreichen, versuchen Sie den Indexvorgang erneut.