管理 Cloud Firestore 中的索引

Cloud Firestore 要求每個 。系統會自動建立最基本查詢所需的索引。您使用及測試應用程式時,Cloud 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 資源類型。

單一欄位索引

下列 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 在索引資料時遇到問題,索引作業就可能會失敗。大多數 這意味著您發現了 索引限制。例如,作業可能已達到每個文件的索引項目數量上限。

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