Ordena y limita los datos

Firestore proporciona una potente función de consulta para especificar qué documentos deseas recuperar de una colección. Estas consultas también se pueden usar con get() o addSnapshotListener(), como se describe en Obtén datos.

Ordena y limita los datos

Según la configuración predeterminada, una consulta recupera todos los documentos que corresponden con la consulta en orden ascendente por ID de documento. Puedes especificar el orden de clasificación para tus datos mediante orderBy() y, con limit(), puedes limitar la cantidad de documentos recuperados. Si especificas un limit(), el valor debe ser mayor o igual que cero.

Por ejemplo, puedes realizar una consulta que te muestre las primeras 3 ciudades en orden alfabético con:

Web versión 9

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

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

Web versión 8

citiesRef.orderBy("name").limit(3);
Swift
Nota: Este producto no se encuentra disponible en los destinos de watchOS ni de App Clips.
citiesRef.order(by: "name").limit(to: 3)
Objective‑C
Nota: Este producto no se encuentra disponible en los destinos de watchOS ni de App Clips.
[[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
(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. Si deseas obtener más información, consulta Configura la autenticación para 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 de forma descendente para ver las últimas 3 ciudades:

Web versión 9

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

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

Web versión 8

citiesRef.orderBy("name", "desc").limit(3);
Swift
Nota: Este producto no se encuentra disponible en los destinos de watchOS ni de App Clips.
citiesRef.order(by: "name", descending: true).limit(to: 3)
Objective‑C
Nota: Este producto no se encuentra disponible en los destinos de watchOS ni de App Clips.
[[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
(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. Si deseas obtener más información, consulta Configura la autenticación para 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 según varios campos. Por ejemplo, si quieres ordenar por estado y, dentro de cada estado, por población de manera descendente, usa este código:

Web versión 9

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

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

Web versión 8

citiesRef.orderBy("state").orderBy("population", "desc");
Swift
Nota: Este producto no se encuentra disponible en los destinos de watchOS ni de App Clips.
citiesRef
  .order(by: "state")
  .order(by: "population", descending: true)
Objective‑C
Nota: Este producto no se encuentra disponible en los destinos de watchOS ni de App Clips.
[[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
(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. Si deseas obtener más información, consulta Configura la autenticación para 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 where() con orderBy() y limit(). En los siguientes ejemplos, las consultas definen un umbral de población, clasifican por población en orden ascendente y muestran solo los primeros resultados que superan el umbral:

Web versión 9

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

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

Web versión 8

citiesRef.where("population", ">", 100000).orderBy("population").limit(2);
Swift
Nota: Este producto no se encuentra disponible en los destinos de watchOS ni de App Clips.
citiesRef
  .whereField("population", isGreaterThan: 100000)
  .order(by: "population")
  .limit(to: 2)
Objective‑C
Nota: Este producto no se encuentra disponible en los destinos de watchOS ni de App Clips.
[[[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
(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. Si deseas obtener más información, consulta Configura la autenticación para 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 rangos (<, <=, > y >=), el primer ordenamiento debe estar en el mismo campo. Consulta la lista de limitaciones de orderBy() 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, esta puede mostrar solo los documentos en los que existe el campo order-by.

Por ejemplo, la siguiente consulta no mostraría ningún documento en el que el campo population no esté configurado, incluso si, de lo contrario, cumple 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 en ese campo. La siguiente consulta no muestra documentos sin un campo population, incluso si country = USA aparece en ese documento. Como solución alternativa, puedes ejecutar consultas separadas para cada orden o asignar un valor a todos los campos en los aplicas un orden.

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

La consulta anterior incluye un order-by implícito sobre la desigualdad y es equivalente a lo siguiente:

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