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
Remarque : Ce produit n'est pas disponible sur les cibles watchOS et App Clip.
citiesRef.order(by: "name").limit(to: 3)
Objective-C
Remarque : Ce produit n'est pas disponible sur les cibles watchOS et App Clip.
[[citiesRef queryOrderedByField:@"name"] queryLimitedTo:3];
Kotlin
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
Query query = cities.orderBy("name").limit(3);
Query query = cities.orderBy("name").limitToLast(3);
Python
cities_ref = db.collection("cities")
query = cities_ref.order_by("name").limit_to_last(2)
results = query.get()
Python
(asynchrone)
cities_ref = db.collection("cities")
query = cities_ref.order_by("name").limit_to_last(2)
results = await query.get()
C++
cities_ref.OrderBy("name").Limit(3);
Node.js
const firstThreeRes = await citiesRef.orderBy('name').limit(3).get();
Go
query := cities.OrderBy("name", firestore.Asc).Limit(3)
query := cities.OrderBy("name", firestore.Asc).LimitToLast(3)
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.

$query = $citiesRef->orderBy('name')->limit(3);
Unity
Query query = citiesRef.OrderBy("Name").Limit(3);
C#
Query query = citiesRef.OrderBy("Name").Limit(3);
Ruby
query = cities_ref.order("name").limit(3)

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
Remarque : Ce produit n'est pas disponible sur les cibles watchOS et App Clip.
citiesRef.order(by: "name", descending: true).limit(to: 3)
Objective-C
Remarque : Ce produit n'est pas disponible sur les cibles watchOS et App Clip.
[[citiesRef queryOrderedByField:@"name" descending:YES] queryLimitedTo:3];
Kotlin
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
Query query = cities.orderBy("name", Direction.DESCENDING).limit(3);
Python
cities_ref = db.collection("cities")
query = cities_ref.order_by("name", direction=firestore.Query.DESCENDING).limit(3)
results = query.stream()
Python
(asynchrone)
cities_ref = db.collection("cities")
query = cities_ref.order_by("name", direction=firestore.Query.DESCENDING).limit(3)
results = query.stream()
C++
cities_ref.OrderBy("name", Query::Direction::kDescending).Limit(3);
Node.js
const lastThreeRes = await citiesRef.orderBy('name', 'desc').limit(3).get();
Go
query := cities.OrderBy("name", firestore.Desc).Limit(3)
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.

$query = $citiesRef->orderBy('name', 'DESC')->limit(3);
Unity
Query query = citiesRef.OrderByDescending("Name").Limit(3);
C#
Query query = citiesRef.OrderByDescending("Name").Limit(3);
Ruby
query = cities_ref.order("name", "desc").limit(3)

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
Remarque : Ce produit n'est pas disponible sur les cibles watchOS et App Clip.
citiesRef
  .order(by: "state")
  .order(by: "population", descending: true)
Objective-C
Remarque : Ce produit n'est pas disponible sur les cibles watchOS et App Clip.
[[citiesRef queryOrderedByField:@"state"] queryOrderedByField:@"population" descending:YES];
Kotlin
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
Query query = cities.orderBy("state").orderBy("population", Direction.DESCENDING);
Python
cities_ref = db.collection("cities")
ordered_city_ref = cities_ref.order_by("state").order_by(
    "population", direction=firestore.Query.DESCENDING
)
Python
(asynchrone)
cities_ref = db.collection("cities")
cities_ref.order_by("state").order_by(
    "population", direction=firestore.Query.DESCENDING
)
C++
cities_ref.OrderBy("state").OrderBy("name", Query::Direction::kDescending);
Node.js
const byStateByPopRes = await citiesRef.orderBy('state').orderBy('population', 'desc').get();
Go
query := client.Collection("cities").OrderBy("state", firestore.Asc).OrderBy("population", firestore.Desc)
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.

$query = $citiesRef->orderBy('state')->orderBy('population', 'DESC');
Unity
Query query = citiesRef.OrderBy("State").OrderByDescending("Population");
C#
Query query = citiesRef.OrderBy("State").OrderByDescending("Population");
Ruby
query = cities_ref.order("state").order("population", "desc")

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
Remarque : Ce produit n'est pas disponible sur les cibles watchOS et App Clip.
citiesRef
  .whereField("population", isGreaterThan: 100000)
  .order(by: "population")
  .limit(to: 2)
Objective-C
Remarque : Ce produit n'est pas disponible sur les cibles watchOS et App Clip.
[[[citiesRef queryWhereField:@"population" isGreaterThan:@100000]
    queryOrderedByField:@"population"]
    queryLimitedTo:2];
Kotlin
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
Query query = cities.whereGreaterThan("population", 2500000L).orderBy("population").limit(2);
Python
cities_ref = db.collection("cities")
query = (
    cities_ref.where(filter=FieldFilter("population", ">", 2500000))
    .order_by("population")
    .limit(2)
)
results = query.stream()
Python
(asynchrone)
cities_ref = db.collection("cities")
query = (
    cities_ref.where(filter=FieldFilter("population", ">", 2500000))
    .order_by("population")
    .limit(2)
)
results = query.stream()
C++
cities_ref.WhereGreaterThan("population", FieldValue::Integer(100000))
    .OrderBy("population")
    .Limit(2);
Node.js
const biggestRes = await citiesRef.where('population', '>', 2500000)
  .orderBy('population').limit(2).get();
Go
query := cities.Where("population", ">", 2500000).OrderBy("population", firestore.Desc).Limit(2)
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.

$query = $citiesRef
    ->where('population', '>', 2500000)
    ->orderBy('population')
    ->limit(2);
Unity
Query query = citiesRef
    .WhereGreaterThan("Population", 2500000)
    .OrderBy("Population")
    .Limit(2);
C#
Query query = citiesRef
    .WhereGreaterThan("Population", 2500000)
    .OrderBy("Population")
    .Limit(2);
Ruby
query = cities_ref.where("population", ">", 2_500_000).order("population").limit(2)

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():

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);