Ordenar y limitar datos

Firestore ofrece una potente función de consulta para especificar los documentos que quieres recuperar de una colección. Estas consultas también se pueden usar con get() o addSnapshotListener(), tal como se describe en Obtener datos.

Ordenar y limitar datos

De forma predeterminada, una consulta recupera todos los documentos que la cumplen en orden ascendente por ID de documento. Puedes especificar el orden de clasificación de tus datos mediante orderBy() y limitar el número de documentos recuperados mediante limit(). Si especifica un limit(), el valor debe ser igual o superior a cero.

Por ejemplo, puedes consultar las tres primeras ciudades por orden alfabético con la siguiente consulta:

Versión web 9

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

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

Versión web 8

citiesRef.orderBy("name").limit(3);
Swift
Nota: Este producto no está disponible en los destinos de watchOS y App Clip.
citiesRef.order(by: "name").limit(to: 3)
Objective‑C
Nota: Este producto no está disponible en los destinos de watchOS y 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
(Async)
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

Para autenticarte en Firestore, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo 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)

También puedes ordenar los resultados de forma descendente para obtener las últimas tres ciudades:

Versión web 9

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

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

Versión web 8

citiesRef.orderBy("name", "desc").limit(3);
Swift
Nota: Este producto no está disponible en los destinos de watchOS y App Clip.
citiesRef.order(by: "name", descending: true).limit(to: 3)
Objective‑C
Nota: Este producto no está disponible en los destinos de watchOS y 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
(Async)
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

Para autenticarte en Firestore, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo 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)

También puedes ordenar los resultados por varios campos. Por ejemplo, si quieres ordenar por estado y, dentro de cada estado, por población en orden descendente, haz lo siguiente:

Versión web 9

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

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

Versión web 8

citiesRef.orderBy("state").orderBy("population", "desc");
Swift
Nota: Este producto no está disponible en los destinos de watchOS y App Clip.
citiesRef
  .order(by: "state")
  .order(by: "population", descending: true)
Objective‑C
Nota: Este producto no está disponible en los destinos de watchOS y 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
(Async)
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

Para autenticarte en Firestore, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo 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")

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

Versión web 9

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

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

Versión web 8

citiesRef.where("population", ">", 100000).orderBy("population").limit(2);
Swift
Nota: Este producto no está disponible en los destinos de watchOS y App Clip.
citiesRef
  .whereField("population", isGreaterThan: 100000)
  .order(by: "population")
  .limit(to: 2)
Objective‑C
Nota: Este producto no está disponible en los destinos de watchOS y 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
(Async)
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

Para autenticarte en Firestore, configura las credenciales predeterminadas de la aplicación. Para obtener más información, consulta el artículo Configurar la autenticación en un entorno de desarrollo 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)

Sin embargo, si tienes un filtro con una comparación de intervalos (<, <=, >, >=), el primer orden debe ser en el mismo campo. Consulta la lista de orderBy()limitaciones que se muestra a continuación.

Limitaciones

Ten en cuenta la siguiente restricción para las cláusulas orderBy():

orderBy y existencia

Cuando ordenas una consulta por un campo determinado, la consulta solo puede devolver los documentos en los que exista el campo de orden.

Por ejemplo, la siguiente consulta no devolvería ningún documento en el que no se haya definido el campo population, aunque cumplan los filtros de la consulta.

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

Se aplica un efecto similar 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 el campo population, aunque country = USA en ese documento . Como solución alternativa, puedes ejecutar consultas independientes para cada orden o asignar un valor a todos los campos por los que ordenas.

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

La consulta anterior incluye una ordenación implícita por la desigualdad y es equivalente a la siguiente:

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