Join us in person and online for Firebase Summit on October 18, 2022. Learn how Firebase can help you accelerate app development, release your app with confidence, and scale with ease. Register now

在 Cloud Firestore 中管理索引

透過集合功能整理內容 你可以依據偏好儲存及分類內容。

Cloud Firestore 通過為每個查詢都需要一個索引來確保查詢性能。系統會自動為您創建最基本查詢所需的索引。在您使用和測試應用時,Cloud Firestore 會生成錯誤消息,幫助您創建應用所需的額外索引。本頁介紹如何管理單字段索引和復合索引。

通過錯誤消息創建缺失索引

如果您嘗試使用未映射到現有索引的範圍子句進行複合查詢,則會收到錯誤消息。錯誤消息包含在 Firebase 控制台中創建缺失索引的直接鏈接。

按照生成的指向 Firebase 控制台的鏈接,查看自動填充的信息,然後單擊Create

使用 Firebase 控制台

要從 Firebase 控制台手動創建新索引:

Firebase 控制台中的 Firestore 索引界面的圖像

  1. 轉到Firebase 控制台Cloud Firestore部分。
  2. 轉到索引選項卡並單擊添加索引
  3. 輸入集合名稱並設置您要為索引排序的字段。
  4. 單擊創建

建立索引可能需要幾分鐘時間,具體取決於查詢的大小。創建它們後,您可以在綜合索引部分查看您的索引及其狀態。如果他們仍在構建,Firebase 控制台會包含一個構建狀態欄。

刪除索引

要刪除索引:

  1. 轉到Firebase 控制台Cloud Firestore部分。
  2. 單擊索引選項卡。
  3. 將鼠標懸停在要刪除的索引上,然後從上下文菜單中選擇刪除
  4. 通過單擊警報中的刪除來確認您要刪除它。

使用 Firebase CLI

您還可以使用Firebase CLI部署索引。首先,在您的項目目錄中運行firebase init firestore 。在設置期間,Firebase CLI 會生成一個 JSON 文件,其中包含正確格式的默認索引。編輯文件以添加更多索引並使用firebase deploy命令進行部署。如果您只想部署索引,請添加--only firestore:indexes標誌。如果您使用 Firebase 控制台對索引進行編輯,請確保您還更新了本地索引文件。請參閱JSON 索引定義參考

索引構建時間

要構建索引,Cloud Firestore 必須設置索引,然後用現有數據回填索引。索引構建時間是設置時間和回填時間的總和:

  • 設置索引需要幾分鐘時間。索引的最短構建時間是幾分鐘,即使是空數據庫也是如此。

  • 回填時間取決於有多少現有數據屬於新索引。與索引定義匹配的字段值越多,回填索引所需的時間就越長。

索引構建是長期運行的操作

在您開始構建索引後,Cloud Firestore 會為操作分配一個唯一名稱。操作名稱以projects/[PROJECT_ID]/databases/(default)/operations/為前綴,例如:

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

但是,您可以在為describe命令指定操作名稱時省略前綴。

列出所有長時間運行的操作

要列出長時間運行的操作,請使用gcloud firestore operations list命令。此命令列出正在進行的和最近完成的操作。完成後幾天列出的操作:

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 的索引數據遇到問題,索引操作可能會失敗。最常見的是,這意味著您達到了索引限制。例如,該操作可能已達到每個文檔的最大索引條目數。

如果索引創建失敗,您會在控制台中看到錯誤消息。在您確認您沒有達到任何索引限制後,請重試您的索引操作。