原生模式的 Firestore 包含兩組作業:Firestore Core 作業和 Firestore Pipeline 作業。
Firestore Core 作業提供標準文件建立、讀取、更新和刪除 (CRUD) 功能,以及對即時監聽查詢和離線持續性的內建支援。這個版本與先前版本的主要運作差異在於,索引為選用項目,且不會自動為單一欄位建立索引。這樣一來,查詢就能在沒有預先索引設定的情況下執行,但未建立索引的查詢預設會掃描整個集合。隨著資料集成長,這可能會導致延遲時間增加和費用提高。
Firestore 管道作業是 Firestore Enterprise 版的核心功能,以進階查詢引擎為基礎,大幅擴展可能的查詢範圍。管道作業採用彈性的查詢語法和獨特的索引方法 (索引為選用項目,不會自動建立),可為應用程式執行進階資料擷取作業。
Firestore Core 作業的功能
核心星域作業可執行標準 CRUD 作業和即時監聽查詢。不過,在企業版上使用這些作業時,索引和帳單的基礎行為與標準版相比有顯著差異。
功能和連貫性
核心作業會保留標準版中使用的熟悉方法鏈結語法 (例如 .where()、.orderBy())。這些作業支援行動裝置和網頁用戶端的即時監聽查詢和離線持續性。建議將這些作業用於標準交易工作負載、簡單的查詢,以及現有的應用程式程式碼遷移作業。
自訂索引
與標準版不同,企業版中的核心作業不會自動建立單一欄位索引。索引為選用項目,並非執行查詢的必要條件。如果缺少特定索引,查詢會執行完整集合掃描。雖然未建立索引的查詢可快速進行原型設計,但隨著資料集成長,這類查詢的執行速度可能會變慢,且費用會增加。開發人員必須手動建立索引,才能提升查詢效能並減少讀取單位消耗量。
計費模式 (以單位為準)
讀取單位的計費方式是以 4 KB 為一組,而非以文件數為準。如果未建立索引的查詢掃描大型集合,系統會根據所有文件中掃描的總位元組數,計算並扣除讀取單元。寫入單元是以 1 KB 為一組計費。寫入文件時,系統會消耗資料的單位,以及每個更新的索引項目的額外單位。與強制執行單一欄位自動建立索引的標準版不同,您現在可以選擇要建立索引的特定欄位,以最佳化寫入費用和效能。
Firestore 管道作業的功能
Firestore Enterprise 版的管道作業採用進階查詢引擎,可移除 Firestore Standard 版的許多現有限制,並提供數百項額外的查詢功能。管道作業具備下列功能:
以階段為基礎的可組合語法
管道查詢的建構方式是定義一系列依序執行的階段。這項功能可執行複雜作業,例如根據匯總結果進行篩選,這是先前無法做到的。
以下範例顯示管道查詢,可找出上個月瀏覽的不重複產品 ID 數量:
guard let cutoffDate = Calendar.current.date(byAdding: .month, value: -1, to: Date()) else {
return
}
let snapshot = try await db.pipeline()
.collection("productViews")
.where(Field("viewedAt").greaterThan(cutoffDate.timeIntervalSince1970))
.aggregate([Field("productId").countDistinct().as("uniqueProductViews")])
.execute()
擴充功能
管道查詢引進了大量新功能,包括:
- 匯總:支援新的匯總函式 (例如
sum(...)、min(...)和count_distinct(...)),並可搭配任意分組欄位使用。 - 關聯性聯結:使用相關子查詢,在集合和子集合之間執行伺服器端聯結。
- 複雜篩選:支援數百個額外函式,可表示任意複雜的
where(...)陳述式,包括regex_match(...)、add(...)和str_contains(...),完全沒有硬性索引需求。 - 部分讀取 / 投影:使用
select(...)、remove_fields(...)和許多其他文件操作階段,擷取文件的動態子集。
如要進一步瞭解這些功能,請參閱「使用 Pipeline 作業查詢資料」。
即時和離線支援
如要使用即時和離線功能,開發人員可以在 Firestore Enterprise 版中,使用 Firestore Core 作業。
用戶端和工具整合
Enterprise 版提供專用功能,可與管道查詢互動及管理管道查詢:
- 查詢說明和剖析:您可以透過查詢說明結果,瞭解查詢消耗的讀取或寫入單位數量,並分析查詢的執行情況。
- 查詢洞察: Enterprise 版支援查詢洞察,可讓您瞭解資料庫中執行的熱門查詢及其效能特徵,進而判斷應在何處建立索引,以提升效能並降低成本
- 新索引類型: 您可以為 Enterprise 版本建立專用索引,包括稀疏、非稀疏和不重複索引等索引類型。此外,這個資料庫也支援建立及編輯 Enterprise 資料庫的向量搜尋索引。
Firestore Standard 版和 Firestore Enterprise 版的差異
核心作業和管道作業之間的主要作業差異在於索引管理,這會直接影響效能和成本。
| 標準版 - 核心作業 | Enterprise 版 - 核心作業和管道作業 | |
| 索引規定 | 查詢必須使用索引。
系統會自動建立個別欄位的索引,但較複雜的查詢則需要手動設定複合式索引或集合群組索引。 |
查詢不需要索引,因此索引為選用項目。
您可以視需要定義索引。企業版也支援更多索引類型,包括非稀疏/稀疏和不重複索引。 |
| 已建立索引的欄位 | 如果索引欄位中沒有 __name__ 欄位,系統會自動附加該欄位。 | __name__「不會」自動附加至已建立索引的欄位。如果對應用程式來說很重要,您需要在已建立索引的欄位中明確指定 __name__。 |
| 排序順序正規化 | 查詢的 order by 子句會經過正規化,方法是在結尾附加不等式欄位和 __name__ 欄位 (如果尚未附加)。這樣一來,無論 order by 子句中包含哪些其他欄位,結果都會以獨特且具決定性的順序排序。 | 不進行排序順序正規化。sort a ASC 等排序順序只保證結果會依欄位 a 排序。Cloud Firestore 會使用現有索引,盡可能以最有效率的順序傳回結果。因此,如果 a 在結果集中不是唯一值,結果的順序可能會因查詢而異,具體取決於索引設定、執行策略等。如要確保結果的排序方式不重複且具決定性,您需要在排序順序中加入 __name__ 等唯一欄位。 |
| 效能 | 已建立索引的查詢:效能和費用會根據結果集大小調整。 |
未建立索引的查詢:效能和費用會隨著資料集大小而調整。 已建立索引的查詢:效能和費用會根據結果集大小調整。 建議您使用「查詢說明」和「查詢洞察」工具建立索引,並提高查詢效能及降低查詢成本。 |
| 儲存空間成本影響 | 自動索引和複合式索引會產生儲存空間用量。 | 由於系統不會為每個欄位自動建立索引,因此可節省儲存空間費用。 |
| 成本基礎 | 系統會針對每次文件讀取、寫入和刪除作業收費。 | 系統會根據讀取單位 (4 KB 為一組) 和寫入單位 (1 KB 為一組) 收費。寫入索引項目會消耗寫入單位。
請參閱範例,瞭解新定價。 |
| 安全性規則 | 安全性規則會驗證讀取/寫入權限,以保護集合。 | 安全性規則會驗證讀取/寫入權限,藉此保護集合。請參閱資料模型指南,瞭解如何建立資料模型,以支援 Pipeline 查詢。 |