Cloud Firestore 支援在單一查詢中,對多個欄位使用範圍與不等式篩選器。您可以使用範圍 同時簡化多個欄位的不等式條件 以便將應用程式開發,方法是將篩選後邏輯的實作委派給 例如 Cloud Firestore
多個欄位的範圍和不相等篩選器
以下查詢會傳回所有年齡層為 。
網頁版 9 模組化
const q = query(
collection(db, "users"),
where('age', '>', 35),
where('height', '>', 60),
where('height', '<', 70)
);
Swift
let query = db.collection("users")
.whereField("age", isGreaterThan: 35)
.whereField("height", isGreaterThan: 60)
.whereField("height", isLessThan: 70)
Objective-C
FIRQuery *query =
[[[[self.db collectionWithPath:@"users"]
queryWhereField:@"age" isGreaterThan:@35]
queryWhereField:@"height" isGreaterThan:@60]
queryWhereField:@"height" isLessThan:@70];
Java Android
Query query = db.collection("users")
.whereGreaterThan("age", 35)
.whereGreaterThan("height", 60)
.whereLessThan("height", 70);
Kotlin+KTX Android
val query = db.collection("users")
.whereGreaterThan("age", 35)
.whereGreaterThan("height", 60)
.whereLessThan("height", 70)
Java
db.collection("users")
.whereGreaterThan("age", 35)
.whereGreaterThan("height", 60)
.whereLessThan("height", 70);
Node.js
db.collection("users")
.where('age', '>', 35),
.where('height', '>', 60),
.where('height', '<', 70)
建立索引註意事項
開始執行查詢之前,請務必詳閱 關於查詢和 Cloud Firestore 資料模型。
在 Cloud Firestore 中,查詢的 ORDER BY
子句會決定哪些索引
以便提供查詢例如,執行 ORDER BY a ASC, b ASC
查詢
需要 a ASC, b ASC
欄位的複合式索引。
如要最佳化 Cloud Firestore 查詢的效能與成本效益,您應 最佳化索引中的欄位順序。執行此操作時,您的索引必須是從左到右排序 否則,查詢會精煉至資料集,以防止掃描 多餘的索引項目。
假設您想搜尋一群員工
薪資超過 100,000 且工作年資為
大於 0。依據您對資料集的瞭解,您知道
薪資限制條件比體驗限制更嚴格。理想
會減少索引掃描次數的索引
(salary [...], experience [...])
。因此,系統會快速處理
符合成本效益可以在 experience
之前訂購 salary
,並如下所示:
Java
db.collection("employees")
.whereGreaterThan("salary", 100000)
.whereGreaterThan("experience", 0)
.orderBy("salary")
.orderBy("experience");
Node.js
db.collection("employees")
.where("salary", ">", 100000)
.where("experience", ">", 0)
.orderBy("salary")
.orderBy("experience");
Python
db.collection("employees")
.where("salary", ">", 100000)
.where("experience", ">", 0)
.order_by("salary")
.order_by("experience");
最佳化索引的最佳做法
最佳化索引時,請注意下列最佳做法。
排序索引欄位的順序為等號,然後依序為選取範圍或不等式欄位
Cloud Firestore 使用複合式索引最左側的欄位來滿足
第一個欄位的相等限制,以及範圍或不等式限制 (如有)
值。orderBy()
這些限制會減少索引數量
Cloud Firestore 掃描的項目Cloud Firestore 會使用其餘欄位
為滿足查詢其他範圍或不等式限制的索引。這些
限制不會減少 Cloud Firestore 掃描的索引項目數量
但會篩除不相符的文件
。
如要進一步瞭解如何建立高效率的索引,請參閱完美索引的定義。
按照查詢限制選擇能力遞減排序欄位
為確保 Cloud Firestore 為您的查詢選取最合適的索引,
指定 orderBy()
子句,以便按照查詢順序將欄位排序
限制選擇能力選擇程度越高,代表結果越小
而較低的選取性能與更大的文件子集相符。請確認
選取範圍或不等式欄位時,選取性較高的值
排序會比選用度較低的欄位排序
盡可能減少 Cloud Firestore 掃描及傳回的文件數量 網路,您應一律按照查詢順序由低至高排序欄位 限制選擇能力如果結果集不是必要順序,而且 結果集應該很小,您可以實作用戶端邏輯 重新下單。
舉例來說,假設您想搜尋一群員工 薪資超過 100000 的員工,並按照年度 員工的經驗。如果您預期只有少數員工會獲得薪資 大於 100000,那麼撰寫查詢的最有效方式如下:
Java
db.collection("employees")
.whereGreaterThan("salary", 100000)
.orderBy("salary")
.get()
.addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
@Override
public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
// Order results by `experience`
}
});;
Node.js
const querySnapshot = await db.collection('employees')
.where("salary", ">", 100000)
.orderBy("salary")
.get();
// Order results by `experience`
Python
results = db.collection("employees")
.where("salary", ">", 100000)
.order_by("salary")
.stream()
// Order results by `experience`
在 experience
中新增排序時,產生的結果會相同
並遮蓋用戶端上的結果重新排序,那麼查詢可能會
讀取比先前的查詢更多多餘的索引項目。這是因為
Cloud Firestore 會優先選擇索引欄位前置字串與
其排序方式。如果 experience
已根據子句加入訂單,
Cloud Firestore 會從中選取「(experience [...], salary [...])
」索引
以便計算查詢結果由於
experience
,Cloud Firestore 會讀取以下項目的「所有」索引項目:
請先處理 employees
個集合,再套用 salary
篩選器尋找最終成果
結果集。這表示索引項目與 salary
不符
,因此查詢的延遲時間和費用也會增加。
定價
針對多個欄位套用範圍和不等式篩選條件的查詢,計費依據如下: 讀取的文件和讀取的索引項目。
詳情請參閱定價頁面。
限制
除了查詢限制之外,請注意, 對多個欄位使用包含範圍和不等式篩選器的查詢:
- 使用範圍或不等式篩選器查詢文件欄位,且僅為等式查詢
文件索引鍵
(__name__)
不受支援。 - Cloud Firestore 將範圍或不等式欄位的數量限制為 10。這是為了避免查詢費用過高 執行。
後續步驟
- 瞭解如何最佳化查詢。
- 進一步瞭解如何執行簡單和複合查詢。
- 瞭解 Cloud Firestore 如何使用索引。