管理 Cloud Firestore 中的索引

Cloud Firestore 要求各個 。系統會自動為最常查詢查詢所需的索引建立索引 建立當您使用及測試應用程式時 Firestore 會產生錯誤訊息,協助您為 這樣的環境本頁說明如何管理 單一欄位複合式索引。

透過錯誤訊息建立遺漏的索引

如果嘗試 含有範圍子句無法對應至現有索引的複合式查詢; 您會收到錯誤訊息。錯誤訊息會包含建立用來建立 Firebase 控制台中缺少索引。

點選產生的連結,前往 Firebase 控制台查看 填入資訊,然後按一下「建立」

角色和權限

在 Cloud Firestore 中建立索引之前,請確認您已指派下列其中一個角色:

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

如果您已定義自訂角色,請指定下列所有權限以建立索引:

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

使用 Firebase 控制台

如要透過 Firebase 控制台手動建立新索引,請按照下列步驟操作:

「
Firebase 控制台中的 Firestore 索引介面

  1. 前往 Firebase 控制台的「Cloud Firestore」部分。
  2. 前往「索引」分頁,然後按一下「新增索引」
  3. 輸入集合名稱,然後設定您要做為索引排序依據的欄位。
  4. 按一下「建立」

索引欄位必須符合欄位路徑的限制

索引可能需要幾分鐘才能建立完成,實際時間取決於查詢的大小。 建立索引後,您可以在「 「複合式索引」區段。如果開發人員仍在建構服務,Firebase 控制台會納入以下功能: 建築物狀態列

移除索引

如何刪除索引:

  1. 前往 Firebase 控制台的「Cloud Firestore」部分。
  2. 按一下「索引」分頁標籤。
  3. 將滑鼠遊標懸停在要刪除的索引上,然後從內容選單中選取「Delete」
  4. 按一下快訊中的「刪除」,確認要刪除。

使用 Firebase CLI

您也可以使用 Firebase CLI 部署索引。 如要開始使用,請在專案目錄中執行 firebase init firestore。 在設定期間,Firebase CLI 會使用預設值產生 JSON 檔案 格式正確編輯檔案,新增更多索引並進行部署 呼叫 firebase deploy 指令。

如果只要部署 Cloud Firestore 索引和規則,請新增 --only firestore 標記。

如果使用 Firebase 控制台編輯索引,請確認 請務必一併更新本機索引檔案。詳情請參閱 JSON 索引定義參考資料

使用 Terraform

在資料庫中建立索引

Cloud Firestore 資料庫可包括單一欄位索引或複合式索引。您可以編輯 Terraform 設定檔,為資料庫建立索引。

單一欄位索引

下列 Terraform 設定檔範例會在 chatrooms 集合的 name 欄位上建立單一欄位索引:

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 {}
}
  • project-id 替換為您的專案 ID。專案 ID 不得重複。
  • 並將 database-id 改成您的資料庫 ID。

複合式索引

下列 Terraform 設定檔範例會針對 name 欄位和 chatrooms 集合中的 description 欄位的組合,建立複合式索引:

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

}
  • project-id 替換為您的專案 ID。專案 ID 不得重複。
  • 並將 database-id 改成您的資料庫 ID。

索引建構時間

如要建立索引,Cloud Firestore 必須設定索引,然後 使用現有資料補充索引。索引建構時間是設定時間的總和 以及補充作業時間:

  • 索引設定作業需要幾分鐘才能完成。最低版本 索引作業會在幾分鐘內完成,就算資料庫是空的。

  • 補充作業時間取決於現有資料中有多少資料屬於新索引。 符合索引定義的其他欄位值,就需要越長 補充索引。

索引建構是「長時間執行的作業」

啟動索引建構作業後,Cloud Firestore 會指派 為運算作業不重複的名稱作業名稱的前置字串為 projects/[PROJECT_ID]/databases/(default)/operations/, 例如:

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

不過,您可以在為作業名稱指定作業名稱時,省略前置字元 describe 指令。

列出所有長時間執行的作業

如要列出長時間執行的作業,請使用 gcloud Firestore 作業清單 指令這個指令會列出進行中和最近完成的作業。 作業完成後,系統會列出幾天的時間:

gcloud firestore operations list

檢查作業狀態

您不必列出所有長時間執行的作業,只需列出 單一作業:

gcloud firestore operations describe operation-name

估算完成時間

作業執行時,可查看 state 欄位值,以瞭解作業的整體狀態。

用於取得長時間執行作業狀態的要求,也會傳回 workEstimatedworkCompleted 指標。系統會根據 份文件。workEstimated 會顯示一張 作業就會處理。workCompleted 會顯示目前已處理的文件數量。作業完成後 workCompleted 反映了 實際處理的時間,該值可能與 workEstimated 的值不同。

workCompleted 除以 workEstimated 可得出進度的粗估值。此估計可能不準確,因為此取決於延遲的統計數據收集。

例如,索引建構的進度狀態如下:

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

作業完成時,作業說明中會包含 "done": true。查看 state 欄位值可得知作業結果。如果未在回應中設定 done 欄位,則其值為 false。若是進行中的作業,則不用考慮是否有 done 值。

索引建構錯誤

管理複合式索引以及 單一欄位索引豁免設定。如果發生下列情況,索引作業可能會失敗: Cloud Firestore 建立索引的資料發生問題。大多數 這意味著您發現了 索引限制。適用對象 例如,這項作業可能已達索引項目數量上限 每份文件。

如果索引建立失敗,控制台中會顯示錯誤訊息。更新後 您得確定目前不會 索引限制,請重新嘗試您的索引作業。