Trier et limiter les données
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 :
Version Web 9
import { query, orderBy, limit } from "firebase/firestore"; const q = query(citiesRef, orderBy("name"), limit(3));
Version Web 8
citiesRef.orderBy("name").limit(3);
Swift
citiesRef.order(by: "name").limit(to: 3)
Objective-C
[[citiesRef queryOrderedByField:@"name"] queryLimitedTo:3];
Kotlin + KTX
Android
citiesRef.orderBy("name").limit(3)
Java
Android
citiesRef.orderBy("name").limit(3);
Dart
final citiesRef = db.collection("cities"); citiesRef.orderBy("name").limit(3);
Java
Python
Python
(asynchrone)
C++
cities_ref.OrderBy("name").Limit(3);
Node.js
Go
PHP
PHP
Pour vous authentifier auprès de Firestore, configurez les Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.
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 :
Version Web 9
import { query, orderBy, limit } from "firebase/firestore"; const q = query(citiesRef, orderBy("name", "desc"), limit(3));
Version Web 8
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
Android
citiesRef.orderBy("name", Query.Direction.DESCENDING).limit(3)
Java
Android
citiesRef.orderBy("name", Direction.DESCENDING).limit(3);
Dart
final citiesRef = db.collection("cities"); citiesRef.orderBy("name", descending: true).limit(3);
Java
Python
Python
(asynchrone)
C++
cities_ref.OrderBy("name", Query::Direction::kDescending).Limit(3);
Node.js
Go
PHP
PHP
Pour vous authentifier auprès de Firestore, configurez les Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.
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 :
Version Web 9
import { query, orderBy } from "firebase/firestore"; const q = query(citiesRef, orderBy("state"), orderBy("population", "desc"));
Version Web 8
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
Android
citiesRef.orderBy("state").orderBy("population", Query.Direction.DESCENDING)
Java
Android
citiesRef.orderBy("state").orderBy("population", Direction.DESCENDING);
Dart
final citiesRef = db.collection("cities"); citiesRef.orderBy("state").orderBy("population", descending: true);
Java
Python
Python
(asynchrone)
C++
cities_ref.OrderBy("state").OrderBy("name", Query::Direction::kDescending);
Node.js
Go
PHP
PHP
Pour vous authentifier auprès de Firestore, configurez les Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.
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 :
Version Web 9
import { query, where, orderBy, limit } from "firebase/firestore"; const q = query(citiesRef, where("population", ">", 100000), orderBy("population"), limit(2));
Version Web 8
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
Android
citiesRef.whereGreaterThan("population", 100000).orderBy("population").limit(2)
Java
Android
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
(asynchrone)
C++
cities_ref.WhereGreaterThan("population", FieldValue::Integer(100000)) .OrderBy("population") .Limit(2);
Node.js
Go
PHP
PHP
Pour vous authentifier auprès de Firestore, configurez les Identifiants par défaut de l'application. Pour en savoir plus, consultez Configurer l'authentification pour un environnement de développement local.
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”);