Ordena y limita datos con Cloud Firestore

Cloud Firestore proporciona una potente funcionalidad de consulta para especificar qué documentos desea recuperar de una colección. Estas consultas también se pueden utilizar con get() o addSnapshotListener() , como se describe en Obtener datos .

Ordenar y limitar datos

De forma predeterminada, una consulta recupera todos los documentos que satisfacen la consulta en orden ascendente por ID de documento. Puede especificar el orden de clasificación de sus datos usando orderBy() y puede limitar la cantidad de documentos recuperados usando limit() . Si especifica un limit() , el valor debe ser mayor o igual a cero.

Por ejemplo, podrías consultar las primeras 3 ciudades alfabéticamente con:

import { query, orderBy, limit } from "firebase/firestore";  

const q = query(citiesRef, orderBy("name"), limit(3));
citiesRef.orderBy("name").limit(3);
Nota: Este producto no está disponible en destinos watchOS y App Clip.
citiesRef.order(by: "name").limit(to: 3)
Nota: Este producto no está disponible en destinos watchOS y App Clip.
[[citiesRef queryOrderedByField:@"name"] queryLimitedTo:3];
citiesRef.orderBy("name").limit(3)
citiesRef.orderBy("name").limit(3);
final citiesRef = db.collection("cities");
citiesRef
.orderBy("name").limit(3);
Query query = cities.orderBy("name").limit(3);
Query query = cities.orderBy("name").limitToLast(3);
cities_ref = db.collection("cities")
query
= cities_ref.order_by("name").limit_to_last(2)
results
= query.get()
cities_ref = db.collection("cities")
query
= cities_ref.order_by("name").limit_to_last(2)
results
= await query.get()
cities_ref.OrderBy("name").Limit(3);
const firstThreeRes = await citiesRef.orderBy('name').limit(3).get();
query := cities.OrderBy("name", firestore.Asc).Limit(3)
query
:= cities.OrderBy("name", firestore.Asc).LimitToLast(3)

PHP

Para obtener más información sobre cómo instalar y crear un cliente de Cloud Firestore, consulte Bibliotecas de clientes de Cloud Firestore .

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

También puedes ordenar en orden descendente para obtener las últimas 3 ciudades:

import { query, orderBy, limit } from "firebase/firestore";  

const q = query(citiesRef, orderBy("name", "desc"), limit(3));
citiesRef.orderBy("name", "desc").limit(3);
Nota: Este producto no está disponible en destinos watchOS y App Clip.
citiesRef.order(by: "name", descending: true).limit(to: 3)
Nota: Este producto no está disponible en destinos watchOS y App Clip.
[[citiesRef queryOrderedByField:@"name" descending:YES] queryLimitedTo:3];
citiesRef.orderBy("name", Query.Direction.DESCENDING).limit(3)
citiesRef.orderBy("name", Direction.DESCENDING).limit(3);
final citiesRef = db.collection("cities");
citiesRef
.orderBy("name", descending: true).limit(3);
Query query = cities.orderBy("name", Direction.DESCENDING).limit(3);
cities_ref = db.collection("cities")
query
= cities_ref.order_by("name", direction=firestore.Query.DESCENDING).limit(3)
results
= query.stream()
cities_ref = db.collection("cities")
query
= cities_ref.order_by("name", direction=firestore.Query.DESCENDING).limit(3)
results
= query.stream()
cities_ref.OrderBy("name", Query::Direction::kDescending).Limit(3);
const lastThreeRes = await citiesRef.orderBy('name', 'desc').limit(3).get();
query := cities.OrderBy("name", firestore.Desc).Limit(3)

PHP

Para obtener más información sobre cómo instalar y crear un cliente de Cloud Firestore, consulte Bibliotecas de clientes de Cloud Firestore .

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

También puedes ordenar por múltiples campos. Por ejemplo, si desea ordenar por estado y dentro de cada estado ordenar por población en orden descendente:

import { query, orderBy } from "firebase/firestore";  

const q = query(citiesRef, orderBy("state"), orderBy("population", "desc"));
citiesRef.orderBy("state").orderBy("population", "desc");
Nota: Este producto no está disponible en destinos watchOS y App Clip.
citiesRef
 
.order(by: "state")
 
.order(by: "population", descending: true)
Nota: Este producto no está disponible en destinos watchOS y App Clip.
[[citiesRef queryOrderedByField:@"state"] queryOrderedByField:@"population" descending:YES];
citiesRef.orderBy("state").orderBy("population", Query.Direction.DESCENDING)
citiesRef.orderBy("state").orderBy("population", Direction.DESCENDING);
final citiesRef = db.collection("cities");
citiesRef
.orderBy("state").orderBy("population", descending: true);
Query query = cities.orderBy("state").orderBy("population", Direction.DESCENDING);
cities_ref = db.collection("cities")
cities_ref
.order_by("state").order_by(
   
"population", direction=firestore.Query.DESCENDING
)
cities_ref = db.collection("cities")
cities_ref
.order_by("state").order_by(
   
"population", direction=firestore.Query.DESCENDING
)
cities_ref.OrderBy("state").OrderBy("name", Query::Direction::kDescending);
const byStateByPopRes = await citiesRef.orderBy('state').orderBy('population', 'desc').get();
query := client.Collection("cities").OrderBy("state", firestore.Asc).OrderBy("population", firestore.Desc)

PHP

Para obtener más información sobre cómo instalar y crear un cliente de Cloud Firestore, consulte Bibliotecas de clientes de Cloud Firestore .

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

Puede combinar filtros where() con orderBy() y limit() . En el siguiente ejemplo, las consultas definen un umbral de población, se clasifican por población en orden ascendente y devuelven solo los primeros resultados que superan el umbral:

import { query, where, orderBy, limit } from "firebase/firestore";  

const q = query(citiesRef, where("population", ">", 100000), orderBy("population"), limit(2));
citiesRef.where("population", ">", 100000).orderBy("population").limit(2);
Nota: Este producto no está disponible en destinos watchOS y App Clip.
citiesRef
 
.whereField("population", isGreaterThan: 100000)
 
.order(by: "population")
 
.limit(to: 2)
Nota: Este producto no está disponible en destinos watchOS y App Clip.
[[[citiesRef queryWhereField:@"population" isGreaterThan:@100000]
    queryOrderedByField
:@"population"]
    queryLimitedTo
:2];
citiesRef.whereGreaterThan("population", 100000).orderBy("population").limit(2)
citiesRef.whereGreaterThan("population", 100000).orderBy("population").limit(2);
final citiesRef = db.collection("cities");
citiesRef
   
.where("population", isGreaterThan: 100000)
   
.orderBy("population")
   
.limit(2);
Query query = cities.whereGreaterThan("population", 2500000L).orderBy("population").limit(2);
cities_ref = db.collection("cities")
query
= (
    cities_ref
.where(filter=FieldFilter("population", ">", 2500000))
   
.order_by("population")
   
.limit(2)
)
results
= query.stream()
cities_ref = db.collection("cities")
query
= (
    cities_ref
.where(filter=FieldFilter("population", ">", 2500000))
   
.order_by("population")
   
.limit(2)
)
results
= query.stream()
cities_ref.WhereGreaterThan("population", FieldValue::Integer(100000))
   
.OrderBy("population")
   
.Limit(2);
const biggestRes = await citiesRef.where('population', '>', 2500000)
 
.orderBy('population').limit(2).get();
query := cities.Where("population", ">", 2500000).OrderBy("population", firestore.Desc).Limit(2)

PHP

Para obtener más información sobre cómo instalar y crear un cliente de Cloud Firestore, consulte Bibliotecas de clientes de Cloud Firestore .

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

Sin embargo, si tiene un filtro con una comparación de rango ( < , <= , > , >= ), su primer pedido debe estar en el mismo campo; consulte la lista de limitaciones de orderBy() a continuación.

Limitaciones

Tenga en cuenta las siguientes restricciones para las cláusulas orderBy() :

  • Una cláusula orderBy() también filtra la existencia de los campos dados . El conjunto de resultados no incluirá documentos que no contengan los campos indicados.
  • Si incluye un filtro con una comparación de rango ( < , <= , > , >= ), su primer pedido debe estar en el mismo campo:

    Válido : filtro de rango y orderBy en el mismo campo

    import { query, where, orderBy } from "firebase/firestore";  

    const q = query(citiesRef, where("population", ">", 100000), orderBy("population"));
    citiesRef.where("population", ">", 100000).orderBy("population");
    Nota: Este producto no está disponible en destinos watchOS y App Clip.
    citiesRef
     
    .whereField("population", isGreaterThan: 100000)
     
    .order(by: "population")
    Nota: Este producto no está disponible en destinos watchOS y App Clip.
    [[citiesRef queryWhereField:@"population" isGreaterThan:@100000]
        queryOrderedByField
    :@"population"];
    citiesRef.whereGreaterThan("population", 100000).orderBy("population")
    citiesRef.whereGreaterThan("population", 100000).orderBy("population");
    final citiesRef = db.collection("cities");
    citiesRef
    .where("population", isGreaterThan: 100000).orderBy("population");
    Query query = cities.whereGreaterThan("population", 2500000L).orderBy("population");
    cities_ref = db.collection("cities")
    query
    = cities_ref.where(filter=FieldFilter("population", ">", 2500000)).order_by(
       
    "population"
    )
    results
    = query.stream()
    cities_ref = db.collection("cities")
    query
    = cities_ref.where(filter=FieldFilter("population", ">", 2500000)).order_by(
       
    "population"
    )
    results
    = query.stream()
    citiesRef.where('population', '>', 2500000).orderBy('population');
    query := cities.Where("population", ">", 2500000).OrderBy("population", firestore.Asc)

    PHP

    Para obtener más información sobre cómo instalar y crear un cliente de Cloud Firestore, consulte Bibliotecas de clientes de Cloud Firestore .

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

    No válido : filtro de rango y primer orderBy en diferentes campos

    import { query, where, orderBy } from "firebase/firestore";  

    const q = query(citiesRef, where("population", ">", 100000), orderBy("country"));
    citiesRef.where("population", ">", 100000).orderBy("country");
    Nota: Este producto no está disponible en destinos watchOS y App Clip.
    citiesRef
     
    .whereField("population", isGreaterThan: 100000)
     
    .order(by: "country")
    Nota: Este producto no está disponible en destinos watchOS y App Clip.
    [[citiesRef queryWhereField:@"population" isGreaterThan:@100000] queryOrderedByField:@"country"];
    citiesRef.whereGreaterThan("population", 100000).orderBy("country")
    citiesRef.whereGreaterThan("population", 100000).orderBy("country");
    final citiesRef = db.collection("cities");
    citiesRef
    .where("population", isGreaterThan: 100000).orderBy("country");
    Query query = cities.whereGreaterThan("population", 2500000L).orderBy("country");
    cities_ref = db.collection("cities")
    query
    = cities_ref.where(filter=FieldFilter("population", ">", 2500000)).order_by(
       
    "country"
    )
    results
    = query.stream()
    cities_ref = db.collection("cities")
    query
    = cities_ref.where(filter=FieldFilter("population", ">", 2500000)).order_by(
       
    "country"
    )
    results
    = query.stream()
    // BAD EXAMPLE -- will crash the program:
    cities_ref
    .WhereGreaterThan("population", FieldValue::Integer(100000))
       
    .OrderBy("country");
    citiesRef.where('population', '>', 2500000).orderBy('country');
    // 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

    Para obtener más información sobre cómo instalar y crear un cliente de Cloud Firestore, consulte Bibliotecas de clientes de Cloud Firestore .

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

orderBy y existencia

Cuando ordena una consulta por un campo determinado, la consulta puede devolver solo los documentos donde existe el campo ordenar por.

Por ejemplo, la siguiente consulta no devolverá ningún documento donde el campo population no esté configurado, incluso si cumplen con los filtros de consulta.

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

Un efecto relacionado se aplica a las desigualdades. Una consulta con un filtro de desigualdad en un campo también implica ordenar por ese campo. La siguiente consulta no devuelve documentos sin un campo population incluso si country = USA en ese documento. Como solución alternativa, puede ejecutar consultas separadas para cada pedido o puede asignar un valor para todos los campos por los que ordena.

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

La consulta anterior incluye un orden implícito en la desigualdad y es equivalente a lo siguiente:

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