Firebase is back at Google I/O on May 10! Register now

在 Cloud Firestore 中管理索引

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

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

通過報錯信息創建缺失索引

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

按照生成的鏈接訪問 Firebase 控制台,查看自動填充的信息,然後單擊創建

使用 Firebase 控制台

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

firebase 控制台中 firestore 索引界面的圖像

  1. 轉到Firebase 控制台Cloud Firestore部分。
  2. 轉到Indexes選項卡並單擊Add Index
  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的值不同。

workCompletedworkEstimated進行粗略的進度預估。估計可能不准確,因為它依賴於延遲的統計信息收集。

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

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

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