Cloud Firestore 提供了強大的查詢功能,用於指定要從集合中擷取哪些文件。這些查詢也可以與get()
或addSnapshotListener()
一起使用,如取得資料中所述。
訂單和限制數據
預設情況下,查詢會依文件 ID 升序擷取滿足查詢的所有文件。您可以使用orderBy()
指定資料的排序順序,並且可以使用limit()
限制擷取的文件數量。如果指定limit()
,則該值必須大於或等於零。
例如,您可以使用以下命令按字母順序查詢前 3 個城市:
Web modular API
import { query, orderBy, limit } from "firebase/firestore"; const q = query(citiesRef, orderBy("name"), limit(3));
Web namespaced API
citiesRef.orderBy("name").limit(3);
迅速
citiesRef.order(by: "name").limit(to: 3)
Objective-C
[[citiesRef queryOrderedByField:@"name"] queryLimitedTo:3];
Kotlin+KTX
citiesRef.orderBy("name").limit(3)
Java
citiesRef.orderBy("name").limit(3);
Dart
final citiesRef = db.collection("cities"); citiesRef.orderBy("name").limit(3);
爪哇
Python
Python
C++
cities_ref.OrderBy("name").Limit(3);
Node.js
去
PHP
PHP
有關安裝和建立 Cloud Firestore 用戶端的更多信息,請參閱Cloud Firestore 用戶端程式庫。
統一
Query query = citiesRef.OrderBy("Name").Limit(3);
C#
紅寶石
您也可以按降序排序以獲取最後3 個城市:
Web modular API
import { query, orderBy, limit } from "firebase/firestore"; const q = query(citiesRef, orderBy("name", "desc"), limit(3));
Web namespaced API
citiesRef.orderBy("name", "desc").limit(3);
迅速
citiesRef.order(by: "name", descending: true).limit(to: 3)
Objective-C
[[citiesRef queryOrderedByField:@"name" descending:YES] queryLimitedTo:3];
Kotlin+KTX
citiesRef.orderBy("name", Query.Direction.DESCENDING).limit(3)
Java
citiesRef.orderBy("name", Direction.DESCENDING).limit(3);
Dart
final citiesRef = db.collection("cities"); citiesRef.orderBy("name", descending: true).limit(3);
爪哇
Python
Python
C++
cities_ref.OrderBy("name", Query::Direction::kDescending).Limit(3);
Node.js
去
PHP
PHP
有關安裝和建立 Cloud Firestore 用戶端的更多信息,請參閱Cloud Firestore 用戶端程式庫。
統一
Query query = citiesRef.OrderByDescending("Name").Limit(3);
C#
紅寶石
您也可以按多個欄位排序。例如,如果您想按州排序,並在每個州內按人口降序排列:
Web modular API
import { query, orderBy } from "firebase/firestore"; const q = query(citiesRef, orderBy("state"), orderBy("population", "desc"));
Web namespaced API
citiesRef.orderBy("state").orderBy("population", "desc");
迅速
citiesRef .order(by: "state") .order(by: "population", descending: true)
Objective-C
[[citiesRef queryOrderedByField:@"state"] queryOrderedByField:@"population" descending:YES];
Kotlin+KTX
citiesRef.orderBy("state").orderBy("population", Query.Direction.DESCENDING)
Java
citiesRef.orderBy("state").orderBy("population", Direction.DESCENDING);
Dart
final citiesRef = db.collection("cities"); citiesRef.orderBy("state").orderBy("population", descending: true);
爪哇
Python
Python
C++
cities_ref.OrderBy("state").OrderBy("name", Query::Direction::kDescending);
Node.js
去
PHP
PHP
有關安裝和建立 Cloud Firestore 用戶端的更多信息,請參閱Cloud Firestore 用戶端程式庫。
統一
Query query = citiesRef.OrderBy("State").OrderByDescending("Population");
C#
紅寶石
您可以將where()
過濾器與orderBy()
和limit()
結合。在以下範例中,查詢定義人口閾值,按人口升序排序,並僅傳回超過閾值的前幾個結果:
Web modular API
import { query, where, orderBy, limit } from "firebase/firestore"; const q = query(citiesRef, where("population", ">", 100000), orderBy("population"), limit(2));
Web namespaced API
citiesRef.where("population", ">", 100000).orderBy("population").limit(2);
迅速
citiesRef .whereField("population", isGreaterThan: 100000) .order(by: "population") .limit(to: 2)
Objective-C
[[[citiesRef queryWhereField:@"population" isGreaterThan:@100000] queryOrderedByField:@"population"] queryLimitedTo:2];
Kotlin+KTX
citiesRef.whereGreaterThan("population", 100000).orderBy("population").limit(2)
Java
citiesRef.whereGreaterThan("population", 100000).orderBy("population").limit(2);
Dart
final citiesRef = db.collection("cities"); citiesRef .where("population", isGreaterThan: 100000) .orderBy("population") .limit(2);
爪哇
Python
Python
C++
cities_ref.WhereGreaterThan("population", FieldValue::Integer(100000)) .OrderBy("population") .Limit(2);
Node.js
去
PHP
PHP
有關安裝和建立 Cloud Firestore 用戶端的更多信息,請參閱Cloud Firestore 用戶端程式庫。
統一
Query query = citiesRef .WhereGreaterThan("Population", 2500000) .OrderBy("Population") .Limit(2);
C#
紅寶石
但是,如果您有一個帶有範圍比較的篩選器( <
、 <=
、 >
、 >=
),則您的第一個排序必須位於同一欄位上,請參閱下面的orderBy()
限制清單。
限制
請注意orderBy()
子句的以下限制:
-
orderBy()
子句也會過濾是否存在給定欄位。結果集將不包括不包含給定欄位的文件。 如果您包含具有範圍比較的篩選器(
<
、<=
、>
、>=
),則您的第一個排序必須位於同一欄位上:有效:範圍過濾器和
orderBy
在同一欄位上Web modular API
import { query, where, orderBy } from "firebase/firestore"; const q = query(citiesRef, where("population", ">", 100000), orderBy("population"));
Web namespaced API
citiesRef.where("population", ">", 100000).orderBy("population");
迅速
注意:此產品不適用於 watchOS 和 App Clip 目標。citiesRef .whereField("population", isGreaterThan: 100000) .order(by: "population")
Objective-C
注意:此產品不適用於 watchOS 和 App Clip 目標。[[citiesRef queryWhereField:@"population" isGreaterThan:@100000] queryOrderedByField:@"population"];
Kotlin+KTX
citiesRef.whereGreaterThan("population", 100000).orderBy("population")
Java
citiesRef.whereGreaterThan("population", 100000).orderBy("population");
Dart
final citiesRef = db.collection("cities"); citiesRef.where("population", isGreaterThan: 100000).orderBy("population");
爪哇
Query query = cities.whereGreaterThan("population", 2500000L).orderBy("population");
Python
Python
Node.js
去
PHP
PHP
有關安裝和建立 Cloud Firestore 用戶端的更多信息,請參閱Cloud Firestore 用戶端程式庫。
統一
Query query = citiesRef .WhereGreaterThan("Population", 2500000) .OrderBy("Population");
C#
紅寶石
無效:範圍過濾器和第一個
orderBy
在不同欄位上Web modular API
import { query, where, orderBy } from "firebase/firestore"; const q = query(citiesRef, where("population", ">", 100000), orderBy("country"));
Web namespaced API
citiesRef.where("population", ">", 100000).orderBy("country");
迅速
注意:此產品不適用於 watchOS 和 App Clip 目標。citiesRef .whereField("population", isGreaterThan: 100000) .order(by: "country")
Objective-C
注意:此產品不適用於 watchOS 和 App Clip 目標。[[citiesRef queryWhereField:@"population" isGreaterThan:@100000] queryOrderedByField:@"country"];
Kotlin+KTX
citiesRef.whereGreaterThan("population", 100000).orderBy("country")
Java
citiesRef.whereGreaterThan("population", 100000).orderBy("country");
Dart
final citiesRef = db.collection("cities"); citiesRef.where("population", isGreaterThan: 100000).orderBy("country");
爪哇
Python
Python
C++
// BAD EXAMPLE -- will crash the program: cities_ref.WhereGreaterThan("population", FieldValue::Integer(100000)) .OrderBy("country");
Node.js
去
PHP
PHP
有關安裝和建立 Cloud Firestore 用戶端的更多信息,請參閱Cloud Firestore 用戶端程式庫。
統一
Query query = citiesRef .WhereGreaterThan("Population", 2500000) .OrderBy("Country");
C#
紅寶石
orderBy
和存在
當您按給定欄位對查詢進行排序時,查詢只能傳回排序依據欄位存在的文件。
例如,以下查詢不會傳回任何未設定population
欄位的文檔,即使它們符合查詢過濾器。
爪哇
db.collection("cities").whereEqualTo("country", “USA”).orderBy(“population”);
一個相關的效應也適用於不平等。對某個欄位使用不等式過濾器的查詢也意味著按該欄位排序。以下查詢不會傳回沒有population
欄位的文檔,即使該文檔中的country = USA
。作為解決方法,您可以為每個排序執行單獨的查詢,也可以為排序所依據的所有欄位指派一個值。
爪哇
db.collection(“cities”).where(or(“country”, USA”), greaterThan(“population”, 250000));
上面的查詢包含對不等式的隱含排序依據,等效於以下:
爪哇
db.collection(“cities”).where(or(“country”, USA”), greaterThan(“population”, 250000)).orderBy(“population”);