Cloud Firestore propose une fonctionnalité de requête puissante qui vous permet de spécifier les documents que vous souhaitez récupérer dans une collection. Ces requêtes peuvent également être utilisées avec get()
ou addSnapshotListener()
, comme décrit dans la section Obtenir des données.
Trier et limiter les données
Par défaut, une requête récupère tous les documents qui y répondent dans l'ordre croissant par ID de document. Vous pouvez spécifier l'ordre dans lequel vous souhaitez trier vos données en utilisant orderBy()
, et vous pouvez limiter le nombre de documents récupérés à l'aide de limit()
. Si vous spécifiez un limit()
, la valeur doit être supérieure ou égale à zéro.
Par exemple, vous pouvez effectuer une requête pour les trois premières villes par ordre alphabétique en indiquant :
Web
import { query, orderBy, limit } from "firebase/firestore"; const q = query(citiesRef, orderBy("name"), limit(3));
Web
citiesRef.orderBy("name").limit(3);
Swift
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);
Java
Python
Python
C++
cities_ref.OrderBy("name").Limit(3);
Node.js
Go
PHP
PHP
Pour en savoir plus sur l'installation et la création d'un client Cloud Firestore, consultez la page Bibliothèques clientes Cloud Firestore.
Unity
Query query = citiesRef.OrderBy("Name").Limit(3);
C#
Ruby
Vous pouvez également trier par ordre décroissant pour obtenir les trois dernières villes :
Web
import { query, orderBy, limit } from "firebase/firestore"; const q = query(citiesRef, orderBy("name", "desc"), limit(3));
Web
citiesRef.orderBy("name", "desc").limit(3);
Swift
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);
Java
Python
Python
C++
cities_ref.OrderBy("name", Query::Direction::kDescending).Limit(3);
Node.js
Go
PHP
PHP
Pour en savoir plus sur l'installation et la création d'un client Cloud Firestore, consultez la page Bibliothèques clientes Cloud Firestore.
Unity
Query query = citiesRef.OrderByDescending("Name").Limit(3);
C#
Ruby
Vous pouvez également trier en utilisant plusieurs champs. Par exemple, si vous souhaitez trier par état, puis, dans chaque état, par ordre décroissant de population :
Web
import { query, orderBy } from "firebase/firestore"; const q = query(citiesRef, orderBy("state"), orderBy("population", "desc"));
Web
citiesRef.orderBy("state").orderBy("population", "desc");
Swift
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);
Java
Python
Python
C++
cities_ref.OrderBy("state").OrderBy("name", Query::Direction::kDescending);
Node.js
Go
PHP
PHP
Pour en savoir plus sur l'installation et la création d'un client Cloud Firestore, consultez la page Bibliothèques clientes Cloud Firestore.
Unity
Query query = citiesRef.OrderBy("State").OrderByDescending("Population");
C#
Ruby
Vous pouvez combiner les filtres where()
avec orderBy()
et limit()
. Dans l'exemple suivant, les requêtes définissent un seuil de population, trient par population par ordre croissant et ne renvoient que les premiers résultats qui dépassent le seuil :
Web
import { query, where, orderBy, limit } from "firebase/firestore"; const q = query(citiesRef, where("population", ">", 100000), orderBy("population"), limit(2));
Web
citiesRef.where("population", ">", 100000).orderBy("population").limit(2);
Swift
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);
Java
Python
Python
C++
cities_ref.WhereGreaterThan("population", FieldValue::Integer(100000)) .OrderBy("population") .Limit(2);
Node.js
Go
PHP
PHP
Pour en savoir plus sur l'installation et la création d'un client Cloud Firestore, consultez la page Bibliothèques clientes Cloud Firestore.
Unity
Query query = citiesRef .WhereGreaterThan("Population", 2500000) .OrderBy("Population") .Limit(2);
C#
Ruby
Toutefois, si vous disposez d'un filtre avec une comparaison de plage (<
, <=
, >
, >=
), votre premier classement doit se trouver dans le même champ. Consultez la liste des limites orderBy()
ci-dessous.
Limites
Notez la restriction suivante pour les clauses orderBy()
:
- Une clause
orderBy()
filtre également l'existence des champs indiqués. L'ensemble de résultats n'inclut pas les documents qui ne contiennent pas les champs indiqués.
orderBy
et existence
Lorsque vous triez une requête par un champ donné, elle ne peut renvoyer que les documents pour lesquels le champ de tri existe.
Par exemple, la requête suivante ne renverrait aucun document pour lequel le champ population
n'est pas défini, même s'ils répondent aux filtres de la requête.
Java
db.collection("cities").whereEqualTo("country", “USA”).orderBy(“population”);
Un effet similaire s'applique aux inégalités. Une requête avec un filtre d'inégalité sur un champ implique également un tri par ce champ. La requête suivante ne renvoie pas de documents sans champ population
, même si country = USA
est présent dans ce document . Pour contourner ce problème, vous pouvez exécuter des requêtes distinctes pour chaque tri ou attribuer une valeur à tous les champs par lesquels vous triez.
Java
db.collection(“cities”).where(or(“country”, USA”), greaterThan(“population”, 250000));
La requête ci-dessus inclut un ordre implicite sur l'inégalité et est équivalente à la suivante:
Java
db.collection(“cities”).where(or(“country”, USA”), greaterThan(“population”, 250000)).orderBy(“population”);