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
citiesRef.order(by: "name").limit(to: 3)
Objective‑C
[[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
Python
Python
(Async)
C++
cities_ref.OrderBy("name").Limit(3);
Node.js
Go
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.
Unity
Query query = citiesRef.OrderBy("Name").Limit(3);
C#
Ruby
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
citiesRef.order(by: "name", descending: true).limit(to: 3)
Objective‑C
[[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
Python
Python
(Async)
C++
cities_ref.OrderBy("name", Query::Direction::kDescending).Limit(3);
Node.js
Go
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.
Unity
Query query = citiesRef.OrderByDescending("Name").Limit(3);
C#
Ruby
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
citiesRef .order(by: "state") .order(by: "population", descending: true)
Objective‑C
[[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
Python
Python
(Async)
C++
cities_ref.OrderBy("state").OrderBy("name", Query::Direction::kDescending);
Node.js
Go
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.
Unity
Query query = citiesRef.OrderBy("State").OrderByDescending("Population");
C#
Ruby
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
citiesRef .whereField("population", isGreaterThan: 100000) .order(by: "population") .limit(to: 2)
Objective‑C
[[[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
Python
Python
(Async)
C++
cities_ref.WhereGreaterThan("population", FieldValue::Integer(100000)) .OrderBy("population") .Limit(2);
Node.js
Go
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.
Unity
Query query = citiesRef .WhereGreaterThan("Population", 2500000) .OrderBy("Population") .Limit(2);
C#
Ruby
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()
:
- Una cláusula
orderBy()
también filtra por la existencia de los campos indicados. El conjunto de resultados no incluirá documentos que no contengan los campos indicados.
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”);