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 sur 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

<ph type="x-smartling-placeholder">
import { query, orderBy, limit } from "firebase/firestore";  

const q = query(citiesRef, orderBy("name"), limit(3));

Version Web 8

<ph type="x-smartling-placeholder">
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 + 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
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

<ph type="x-smartling-placeholder">
import { query, orderBy, limit } from "firebase/firestore";  

const q = query(citiesRef, orderBy("name", "desc"), limit(3));

Version Web 8

<ph type="x-smartling-placeholder">
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 + 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
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

<ph type="x-smartling-placeholder">
import { query, orderBy } from "firebase/firestore";  

const q = query(citiesRef, orderBy("state"), orderBy("population", "desc"));

Version Web 8

<ph type="x-smartling-placeholder">
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 + 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
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

<ph type="x-smartling-placeholder">
import { query, where, orderBy, limit } from "firebase/firestore";  

const q = query(citiesRef, where("population", ">", 100000), orderBy("population"), limit(2));

Version Web 8

<ph type="x-smartling-placeholder">
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 + 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
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 en fonction d'un champ donné, elle peut uniquement renvoyer le documents dans lesquels ce champ existe.

Par exemple, la requête suivante ne renverrait aucun document pour lequel le Le champ population n'est pas défini, même s'il répond aux filtres de requête.

Java
db.collection("cities").whereEqualTo("country", “USA”).orderBy(“population”);

Un effet connexe s'applique aux inégalités. Une requête avec un filtre d'inégalité sur un champ implique également un tri selon ce champ. Les éléments suivants : ne renvoie pas de documents sans champ population, même si country = USA dans ce document . Pour contourner ce problème, vous pouvez exécuter des requêtes distinctes pour chaque tri ou vous pouvez attribuer une valeur à tous les champs que vous commandez.

Java
db.collection(“cities”).where(or(“country”, USA”), greaterThan(“population”, 250000));

La requête ci-dessus inclut un tri implicite sur l'inégalité et est équivaut à ce qui suit:

Java
db.collection(“cities”).where(or(“country”, USA”), greaterThan(“population”, 250000)).orderBy(“population”);