本頁說明如何管理索引。如要進一步瞭解索引,請參閱索引總覽。
事前準備
如要在 Cloud Firestore 中建立索引,請務必先獲派下列任一角色:
roles/datastore.ownerroles/datastore.indexAdminroles/editorroles/owner
如要授予角色,請參閱「授予單一角色」。如要進一步瞭解 Cloud Firestore 角色和相關聯的權限,請參閱「預先定義角色」。
如果您已定義自訂角色,請指派下列所有權限來建立索引:
datastore.indexes.createdatastore.indexes.deletedatastore.indexes.getdatastore.indexes.listdatastore.indexes.update
建立索引
如要建立索引,請完成下列步驟:
MongoDB API
使用 createIndex() 方法建立索引。例如:
-
db.restaurants.createIndex({"cuisine" : 1})
-
db.restaurants.createIndex({"cuisine" : 1}, {sparse: true})
-
系統也支援使用
db.runCommand()建立索引,但最多只能建立一個索引。db.runCommand({"createIndexes":"restaurant", "index": [{"key": {"cuisine":1}, {"name": "cuisine_index"}]})
請注意下列限制:
Firebase 控制台
gcloud CLI
如要建立索引,請使用 gcloud firestore indexes composite create 指令。將 api-scope 設為 mongodb-compatible-api。
gcloud firestore indexes composite create \ --database='DATABASE_ID' \ --collection-group=COLLECTION \ --field-config=FIELD_CONFIGURATION \ --query-scope=collection-group \ --density=dense \ --api-scope=mongodb-compatible-api
更改下列內容:
- DATABASE_ID:資料庫 ID。
- COLLECTION:集合名稱。
- FIELD_CONFIGURATION:欄位設定。為每個欄位新增
--field-config=field-path=。例如:--field-config=field-path=user-id,order=descending \ --field-config=field-path=score,order=descending如要進一步瞭解如何設定這些欄位,請參閱
--field-config。
如要建立稀疏索引,請設定 --density=sparse-any。
如要建立多鍵索引,請新增 --multikey 旗標。
如要建立不重複的索引,請新增 --unique 旗標。
Terraform
使用 google_firestore_index 資源,並將 api_scope 設為 MONGODB_COMPATIBLE_API,以及將 query_scope 設為 COLLECTION_GROUP。
resource "google_firestore_index" "index" { database = "DATABASE_ID" collection = "COLLECTION" api_scope = "MONGODB_COMPATIBLE_API" query_scope = "COLLECTION_GROUP" // You can include multiple field blocks fields { field_path = "FIELD_PATH" order = "ORDER" } // Optional multikey = true density = "DENSITY" }
更改下列內容:
- DATABASE_ID:所選資料庫的資料庫 ID
- COLLECTION:要建立索引的集合名稱
- FIELD_PATH:要建立索引的欄位名稱
- ORDER:
ASCENDING或DESCENDING - DENSITY:
SPARSE_ANY或DENSE
建立文字索引
如要在集合中搜尋特定字串,請建立文字索引。
如要為集合建立文字索引,請完成下列步驟:
MongoDB API
使用 createIndex() 方法建立文字索引。在下列範例中,當文件寫入 cities 集合並填入 country 或 food 欄位時,這些欄位會編入索引,以供搜尋。
db.cities.createIndex({"country": "text", "food": "text"})
欄位必須是字串或字串陣列,才能建立索引。
陣列索引不會編入搜尋索引。因此,為 a.1.b 編製索引時,系統會為 {a: {1: {b: something}}} 中的 something 編製索引,但不會為 {a: [one, {b: something}]} 中的 something 編製索引。
您也可以使用 db.runCommand() 建立索引。每個集合只能有一個文字索引,但您可以在一個 db.runCommand() 中建立多個不同類型的索引。以下範例使用 db.runCommand() 建立文字索引:
db.runCommand({
createIndexes: "cities",
indexes: [
{
key: { "country": "text", "food": "text" },
name: "country_text_food_text"
}
]
})
指定預設語言
您也可以選擇指定預設語言,或在文件中指定包含預設語言的欄位路徑。
在以下範例中,myLanguageField 指定為 language_override。如果 cities 集合中的文件包含名為 myLanguageField 的欄位,系統會使用該欄位的值,判斷要為該特定文件的 country 欄位建立索引的語言。該值會覆寫 french 的預設語言。
db.cities.createIndex({"country": "text"}, {"default_language": "french", "language_override": "myLanguageField"})
- 你可以輸入語言的完整名稱 (
english) 或雙字母 ISO 語言代碼 (en)。 - 如果未設定預設語言,Cloud Firestore 會預設為英文。
- 語言覆寫欄位必須是頂層欄位。如果未設定,語言覆寫欄位預設為
language。 - 如果將預設語言設為
null字元,Cloud Firestore 就不會使用任何欄位做為語言覆寫。
展開即可查看支援的語言清單
| 語言代碼 | 語言名稱 |
|---|---|
| 「und」 | 自動偵測 |
| "af" | 南非荷蘭文 |
| 「ak」 | 阿肯文 |
| 「sq」 | 阿爾巴尼亞文 |
| 「am」 | 阿姆哈拉文 |
| "ar" | 阿拉伯文 |
| "hy" | 亞美尼亞文 |
| "az" | 亞塞拜然文 |
| "eu" | 巴斯克文 |
| "be" | 白俄羅斯語 |
| "bn" | 孟加拉文 |
| "bs" | 波士尼亞文 |
| 「bg」 | 保加利亞文 |
| 「我的」 | 緬甸文 |
| "ca" | 加泰隆尼亞文 |
| "ceb" | 宿霧文 |
| "chr" | 卻洛奇文 |
| "zh" | 中文 |
| 「zh-Hant」 | Chinese_Traditional |
| 「hr」 | 克羅埃西亞文 |
| 「cs」 | 捷克文 |
| 「da」 | 丹麥文 |
| 「nl」 | 荷蘭文 |
| 「en」 | 英文 |
| 「eo」 | 世界語 |
| "et" | 愛沙尼亞文 |
| 「fil」 | 菲律賓文 |
| "fi" | 芬蘭文 |
| 「fr」 | 法文 |
| "gl" | 加里西亞文 |
| "ka" | 喬治亞文 |
| "de" | 德文 |
| 「el」 | 希臘文 |
| "gu" | 古吉拉特文 |
| "ht" | Haitian_Creole |
| "ha" | 豪薩文 |
| "haw" | 夏威夷文 |
| 「iw」 | 希伯來文 |
| 「嗨」 | 北印度文 |
| "hmn" | 苗文 |
| "hu" | 匈牙利文 |
| "is" | 冰島文 |
| "ig" | 伊博文 |
| 「id」 | 印尼文 |
| 「ga」 | 愛爾蘭文 |
| "it" | 義大利文 |
| "ja" | 日文 |
| "jv" | 爪哇文 |
| 「kn」 | 卡納達文 |
| "kk" | 哈薩克文 |
| 「km」 | 高棉文 |
| "ko" | 韓文 |
| "lo" | 寮文 |
| "la" | 拉丁文 |
| "lv" | 拉脫維亞文 |
| "lt" | 立陶宛文 |
| "lb" | 盧森堡文 |
| "mk" | 馬其頓文 |
| 「mg」 | 馬達加斯加文 |
| "ms" | 馬來文 |
| "ml" | 馬拉雅拉姆文 |
| 「mt」 | 馬耳他文 |
| 「mi」 | 毛利文 |
| "mr" | 馬拉地文 |
| "mfe" | 模里西斯文 |
| 「mn」 | 蒙古文 |
| 「sr-ME」 | Serbian_Montenegro |
| 「ne」 | 尼泊爾文 |
| 「no」 | 挪威文 |
| 「ny」 | 尼揚賈文 |
| 「或」 | 歐利亞文 |
| "fa" | 波斯文 |
| "pl" | 波蘭文 |
| 「pt-BR」 | Portuguese_Brazil |
| 「pt-PT」 | Portuguese_Portugal |
| 「pa」 | 旁遮普文 |
| "ro" | 羅馬尼亞文 |
| "ru" | 俄文 |
| "gd" | 蘇格蘭蓋爾文 |
| "sr" | 塞爾維亞文 |
| "st" | 席索托文 |
| "si" | 錫蘭文 |
| "sk" | 斯洛伐克文 |
| 「sl」 | 斯洛維尼亞文 |
| 「so」 | 索馬里文 |
| 「es」 | 西班牙文 |
| "su" | 巽他文 |
| 「sw」 | 史瓦西里文 |
| 「sv」 | 瑞典文 |
| "tg" | 塔吉克文 |
| "ta" | 泰米爾文 |
| "te" | 泰盧固文 |
| "th" | 泰文 |
| 「tr」 | 土耳其文 |
| 「uk」 | 烏克蘭文 |
| "ur" | 烏都文 |
| "uz" | 烏茲別克文 |
| 「vi」 | 越南文 |
| 「cy」 | 威爾斯文 |
| "yi" | 意第緒語 |
| "yo" | 約魯巴文 |
| "zu" | 祖魯文 |
分割文字索引
您也可以使用欄位分割索引,以便依特定欄位值篩選查詢。如果您一律需要篩選所查詢索引中的特定欄位,這項設定可讓您執行效能更高的查詢。
如要建立含有分區的索引,請按照下列方式設定 firestoreOptions 欄位:
db.runCommand({
createIndexes: "cities",
indexes: [
{
key: { "country": "text", "food": "text"},
name: "country_text_food_text"
firestoreOptions: {"customPartitionFields": ["PARTITIONED_FIELD"]
}
]
})
其中:
PARTITIONED_FIELD是用於分區的欄位名稱。這個值必須是字串,且必須參照頂層欄位。對分區索引執行查詢時,您可以根據這個欄位的值篩選結果。舉例來說,您可以使用city分割索引。如果文字索引中定義了city欄位,使用者就能查詢特定城市。分區只能有一個欄位。如果分割索引,則只能執行指定分割欄位的查詢。
限制
Firebase控制台
前往 Firebase 控制台的「Firestore Database」頁面。
從資料庫清單中選取資料庫。
在「索引」分頁中,按一下「建立索引」。
輸入集合 ID。
新增一或多個欄位路徑,並為每個路徑選取索引選項。
點選「建立」。
新索引會顯示在索引清單中,且 MongoDB 相容作業會開始建立索引。建立索引後,索引旁會顯示綠色勾號。如果未建立索引,請參閱「索引建構錯誤」一文,瞭解可能原因。
建立 2dsphere 索引
建立 2dsphere 索引,執行地理空間查詢,並搜尋特定經緯度一定範圍內的現有文件。
如要為集合建立 2dsphere 索引,請完成下列步驟:
MongoDB API
使用 createIndex() 方法建立索引。例如:
db.restaurants.createIndex({"location" : "2dsphere", "region": "2dsphere"})
系統也支援使用 db.runCommand() 建立索引,但最多只能建立一個索引:
db.runCommand({
createIndexes: "restaurants",
indexes: [
{
key: { "location": "2dsphere", "region": "2dsphere" },
name: "location_2dsphere_region_2dsphere"
}
]
})
分割 2dsphere 索引
您也可以使用欄位分割索引,以便依特定欄位值篩選查詢。如果您一律需要篩選所查詢索引中的特定欄位,這項設定可讓您執行效能更高的查詢。
如要建立含有分區的索引,請按照下列方式設定 firestoreOptions 欄位:
db.runCommand({
createIndexes: "restaurants",
indexes: [
{
key: { "location": "2dsphere", "region": "2dsphere" },
name: "location_2dsphere_region_2dsphere"
firestoreOptions: {"customPartitionFields": ["PARTITIONED_FIELD"]
}
]
})
其中:
PARTITIONED_FIELD是用於分區的欄位名稱。對分區索引執行查詢時,您可以根據這個欄位的值篩選結果。舉例來說,如果索引有區域位置的region欄位,您可以使用region分割索引,讓使用者查詢所在區域的餐廳。如果為索引建立分區,您就只能執行指定分區欄位的查詢。
限制
Firebase控制台
前往 Firebase 控制台的「Firestore Database」頁面。
從資料庫清單中選取資料庫。
在「索引」分頁中,按一下「建立索引」。
輸入集合 ID。
新增一或多個欄位路徑,並為每個路徑選取索引選項。
點選「建立」。
新索引會顯示在索引清單中,且 MongoDB 相容作業會開始建立索引。建立索引後,索引旁會顯示綠色勾號。如果未建立索引,請參閱「索引建構錯誤」一文,瞭解可能原因。
刪除索引
如要刪除索引,請完成下列步驟:
MongoDB API
使用 dropIndex() 方法刪除索引。例如:
使用索引名稱刪除索引
db.restaurants.dropIndex("cuisine_index")
使用索引定義刪除索引
db.restaurants.dropIndex({"cuisine" : 1})
Firebase 控制台
-
前往 Firebase 控制台的「Firestore Database」頁面。
- 從資料庫清單中選取資料庫。
- 按一下「索引」分頁標籤。
- 在索引清單中,針對要刪除的索引,從「更多」按鈕 選擇「刪除」。
- 按一下「刪除索引」。
gcloud CLI
如要找出索引名稱,請使用
gcloud firestore indexes composite list指令。gcloud firestore indexes composite list \ --database='DATABASE_ID'
將 DATABASE_ID 替換為資料庫 ID。
-
如要刪除索引,請使用
gcloud firestore indexes composite delete指令。gcloud firestore indexes composite delete INDEX_NAME \ --database='DATABASE_ID'
更改下列內容:
- INDEX_NAME:索引名稱
- DATABASE_ID:資料庫 ID
索引建構時間
如要建構索引,Cloud Firestore 必須建立索引,然後使用現有資料回填索引項目。建立索引所需的時間取決於下列因素:
即使是空白資料庫,索引的建構時間也至少需要幾分鐘。
補充索引項目所需的時間,取決於新索引中現有資料的數量。與索引定義相符的欄位值越多,回填索引項目的時間就越長。
管理長時間執行的作業
建立索引是長時間執行的作業。以下各節說明如何處理索引的長時間執行作業。
開始建立索引後,Cloud Firestore 會為作業指派不重複的名稱。作業名稱的前置字串為 projects/PROJECT_ID/databases/DATABASE_ID/operations/,例如:
projects/PROJECT_ID/databases/DATABASE_ID/operations/ASA1MTAwNDQxNAgadGx1YWZlZAcSeWx0aGdpbi1zYm9qLW5pbWRhEgopEg
為 describe 指令指定作業名稱時,可以省略前置字串。
列出所有長時間執行的作業
如要列出長時間執行的作業,請使用 gcloud firestore operations list 指令。這個指令會列出進行中和最近完成的作業。
匯出完成後其項目會保留幾天:
gcloud firestore operations list
檢查作業狀態
您可以列出單一作業的詳細資料,而不必列出所有長時間執行的作業:
gcloud firestore operations describe operation-name
估算完成時間
作業執行時,可查看 state 欄位值,以瞭解作業的整體狀態。
用於取得長時間執行作業狀態的要求,也會傳回 workEstimated 和workCompleted 指標。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 欄位,則表示作業尚未完成。