Commandez et limitez les données avec Cloud Firestore

Cloud Firestore fournit une fonctionnalité de requête puissante pour spécifier les documents que vous souhaitez récupérer d'une collection. Ces requêtes peuvent également être utilisées avec get() ou addSnapshotListener() , comme décrit dans Get Data .

Commander et limiter les données

Par défaut, une requête récupère tous les documents qui satisfont à la requête par ordre croissant par ID de document. Vous pouvez spécifier l'ordre de tri de vos données à l'aide orderBy() , et vous pouvez limiter le nombre de documents récupérés à l'aide limit() . Si vous spécifiez un limit() , la valeur doit être supérieure ou égale à zéro.

Par exemple, vous pouvez rechercher les 3 premières villes par ordre alphabétique avec :

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);
Rapide
Remarque : ce produit n'est pas disponible sur les cibles watchOS et App Clip.
citiesRef.order(by: "name").limit(to: 3)
Objectif c
Remarque : ce produit n'est pas disponible sur les cibles watchOS et App Clip.
[[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
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

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);
Noeud.js
const firstThreeRes = await citiesRef.orderBy('name').limit(3).get();
Aller
query := cities.OrderBy("name", firestore.Asc).Limit(3)
query := cities.OrderBy("name", firestore.Asc).LimitToLast(3)
PHP

PHP

Pour en savoir plus sur l'installation et la création d'un client Cloud Firestore, reportez-vous à Bibliothèques client Cloud Firestore .

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

Vous pouvez également trier par ordre décroissant pour obtenir les 3 dernières villes :

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);
Rapide
Remarque : ce produit n'est pas disponible sur les cibles watchOS et App Clip.
citiesRef.order(by: "name", descending: true).limit(to: 3)
Objectif c
Remarque : ce produit n'est pas disponible sur les cibles watchOS et App Clip.
[[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
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

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);
Noeud.js
const lastThreeRes = await citiesRef.orderBy('name', 'desc').limit(3).get();
Aller
query := cities.OrderBy("name", firestore.Desc).Limit(3)
PHP

PHP

Pour en savoir plus sur l'installation et la création d'un client Cloud Firestore, reportez-vous à Bibliothèques client Cloud Firestore .

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

Vous pouvez également commander par plusieurs champs. Par exemple, si vous souhaitez trier par état et, au sein de chaque état, trier par population par ordre décroissant :

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");
Rapide
Remarque : ce produit n'est pas disponible sur les cibles watchOS et App Clip.
citiesRef
  .order(by: "state")
  .order(by: "population", descending: true)
Objectif c
Remarque : ce produit n'est pas disponible sur les cibles watchOS et App Clip.
[[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
Query query = cities.orderBy("state").orderBy("population", Direction.DESCENDING);
Python
cities_ref = db.collection("cities")
cities_ref.order_by("state").order_by(
    "population", direction=firestore.Query.DESCENDING
)

Python

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);
Noeud.js
const byStateByPopRes = await citiesRef.orderBy('state').orderBy('population', 'desc').get();
Aller
query := client.Collection("cities").OrderBy("state", firestore.Asc).OrderBy("population", firestore.Desc)
PHP

PHP

Pour en savoir plus sur l'installation et la création d'un client Cloud Firestore, reportez-vous à Bibliothèques client Cloud Firestore .

$query = $citiesRef->orderBy('state')->orderBy('population', 'DESC');
Unité
Query query = citiesRef.OrderBy("State").OrderByDescending("Population");
C#
Query query = citiesRef.OrderBy("State").OrderByDescending("Population");
Rubis
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 renvoient uniquement les premiers résultats qui dépassent le seuil :

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

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

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);
Noeud.js
const biggestRes = await citiesRef.where('population', '>', 2500000)
  .orderBy('population').limit(2).get();
Aller
query := cities.Where("population", ">", 2500000).OrderBy("population", firestore.Desc).Limit(2)
PHP

PHP

Pour en savoir plus sur l'installation et la création d'un client Cloud Firestore, reportez-vous à Bibliothèques client Cloud Firestore .

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

Cependant, si vous disposez d'un filtre avec une comparaison de plage ( < , <= , > , >= ), votre première commande doit être sur le même champ, voir la liste des limitations orderBy() ci-dessous.

Limites

Notez les restrictions suivantes pour les clauses orderBy() :

  • Une clause orderBy() filtre également l'existence des champs donnés . Le jeu de résultats n'inclura pas les documents qui ne contiennent pas les champs donnés.
  • Si vous incluez un filtre avec une comparaison de plage ( < , <= , > , >= ), votre première commande doit être sur le même champ :

    Valide : Filtre de plage et orderBy sur le même champ

    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");
    Rapide
    Remarque : ce produit n'est pas disponible sur les cibles watchOS et App Clip.
    citiesRef
      .whereField("population", isGreaterThan: 100000)
      .order(by: "population")
    Objectif c
    Remarque : ce produit n'est pas disponible sur les cibles watchOS et 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");
    Java
    Query query = cities.whereGreaterThan("population", 2500000L).orderBy("population");
    Python
    cities_ref = db.collection("cities")
    query = cities_ref.where(filter=FieldFilter("population", ">", 2500000)).order_by(
        "population"
    )
    results = query.stream()

    Python

    cities_ref = db.collection("cities")
    query = cities_ref.where(filter=FieldFilter("population", ">", 2500000)).order_by(
        "population"
    )
    results = query.stream()
    Noeud.js
    citiesRef.where('population', '>', 2500000).orderBy('population');
    Aller
    query := cities.Where("population", ">", 2500000).OrderBy("population", firestore.Asc)
    PHP

    PHP

    Pour en savoir plus sur l'installation et la création d'un client Cloud Firestore, reportez-vous à Bibliothèques client Cloud Firestore .

    $query = $citiesRef
        ->where('population', '>', 2500000)
        ->orderBy('population');
    Unité
    Query query = citiesRef
        .WhereGreaterThan("Population", 2500000)
        .OrderBy("Population");
    C#
    Query query = citiesRef
        .WhereGreaterThan("Population", 2500000)
        .OrderBy("Population");
    Rubis
    query = cities_ref.where("population", ">", 2_500_000).order("population")

    Invalide : filtre de plage et premier orderBy sur différents champs

    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");
    Rapide
    Remarque : ce produit n'est pas disponible sur les cibles watchOS et App Clip.
    citiesRef
      .whereField("population", isGreaterThan: 100000)
      .order(by: "country")
    Objectif c
    Remarque : ce produit n'est pas disponible sur les cibles watchOS et 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");
    Java
    Query query = cities.whereGreaterThan("population", 2500000L).orderBy("country");
    Python
    cities_ref = db.collection("cities")
    query = cities_ref.where(filter=FieldFilter("population", ">", 2500000)).order_by(
        "country"
    )
    results = query.stream()

    Python

    cities_ref = db.collection("cities")
    query = cities_ref.where(filter=FieldFilter("population", ">", 2500000)).order_by(
        "country"
    )
    results = query.stream()
    C++
    // BAD EXAMPLE -- will crash the program:
    cities_ref.WhereGreaterThan("population", FieldValue::Integer(100000))
        .OrderBy("country");
    Noeud.js
    citiesRef.where('population', '>', 2500000).orderBy('country');
    Aller
    // Note: This is an invalid query. It violates the constraint that range
    // and order by are required to be on the same field.
    query := cities.Where("population", ">", 2500000).OrderBy("country", firestore.Asc)
    PHP

    PHP

    Pour en savoir plus sur l'installation et la création d'un client Cloud Firestore, reportez-vous à Bibliothèques client Cloud Firestore .

    $invalidRangeQuery = $citiesRef
        ->where('population', '>', 2500000)
        ->orderBy('country');
    Unité
    Query query = citiesRef
        .WhereGreaterThan("Population", 2500000)
        .OrderBy("Country");
    C#
    Query query = citiesRef
        .WhereGreaterThan("Population", 2500000)
        .OrderBy("Country");
    Rubis
    query = cities_ref.where("population", ">", 2_500_000).order("country")

orderBy et existence

Lorsque vous triez une requête en fonction d'un champ donné, la requête ne peut renvoyer que les documents pour lesquels le champ de tri existe.

Par exemple, la requête suivante ne renvoie aucun document pour lequel le champ population n'est pas défini, même s'ils répondent 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 classement par ce champ. La requête suivante ne renvoie pas les 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 commande ou attribuer une valeur à tous les champs selon lesquels vous commandez.

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 à ce qui suit :

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