Ordenar e limitar dados

O Firestore oferece uma poderosa funcionalidade de consulta para especificar quais documentos você quer recuperar em uma coleção. Essas consultas também podem ser usadas com get() ou addSnapshotListener(), conforme descrito em Receber dados.

Ordenar e limitar dados

Por padrão, uma consulta recupera todos os documentos que atendem a ela em ordem crescente por ID. Use orderBy() para especificar a ordem de classificação dos dados e limit() para limitar o número de documentos recuperados. Se você especificar um limit(), o valor precisará ser maior ou igual a zero.

Por exemplo, para consultar as três primeiras cidades em ordem alfabética, use:

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

const q = query(citiesRef, orderBy("name"), limit(3));
citiesRef.orderBy("name").limit(3);
Observação: esse produto não está disponível para destinos watchOS e de clipes de apps.
citiesRef.order(by: "name").limit(to: 3)
Observação: este produto não está disponível para watchOS e destinos de clipes de apps.
[[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 autenticar no Firestore, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.

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

Para ver as três últimas cidades, classifique em ordem decrescente:

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

const q = query(citiesRef, orderBy("name", "desc"), limit(3));
citiesRef.orderBy("name", "desc").limit(3);
Observação: esse produto não está disponível para destinos watchOS e de clipes de apps.
citiesRef.order(by: "name", descending: true).limit(to: 3)
Observação: este produto não está disponível para watchOS e destinos de clipes de apps.
[[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 autenticar no Firestore, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.

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

Além disso, também é possível ordenar por vários campos. Por exemplo, se você quiser ordenar por estado e, dentro de cada estado ordenar por população em ordem decrescente:

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

const q = query(citiesRef, orderBy("state"), orderBy("population", "desc"));
citiesRef.orderBy("state").orderBy("population", "desc");
Observação: esse produto não está disponível para destinos watchOS e de clipes de apps.
citiesRef
  .order(by: "state")
  .order(by: "population", descending: true)
Observação: este produto não está disponível para watchOS e destinos de clipes de apps.
[[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")
ordered_city_ref = 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 autenticar no Firestore, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.

$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")

É possível combinar filtros where() com orderBy() e limit(). No exemplo a seguir, as consultas definem um limite para população, ordenam por esse valor em ordem crescente e retornam apenas os primeiros resultados que excedem o limite:

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);
Observação: esse produto não está disponível para destinos watchOS e de clipes de apps.
citiesRef
  .whereField("population", isGreaterThan: 100000)
  .order(by: "population")
  .limit(to: 2)
Observação: este produto não está disponível para watchOS e destinos de clipes de apps.
[[[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 autenticar no Firestore, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.

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

No entanto, se você tiver um filtro com uma comparação de intervalos (<, <=, >, >=), sua primeira classificação precisará estar no mesmo campo. Consulte a lista de limitações de orderBy() abaixo.

Limitações

Observe a seguinte restrição para cláusulas orderBy():

orderBy e existência

Quando você ordena uma consulta por um determinado campo, ela só pode retornar os documentos em que o campo de ordenação existe.

Por exemplo, a consulta a seguir não retornaria nenhum documento em que o campo population não estivesse definido, mesmo que atendesse aos filtros de consulta.

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

Um efeito relacionado se aplica a desigualdades. Uma consulta com um filtro de desigualdade em um campo também implica ordenação por esse campo. A consulta a seguir não retorna documentos sem um campo population, mesmo que country = USA nesse documento. Como solução alternativa, você pode executar consultas separadas para cada ordem ou atribuir um valor para todos os campos que ordena.

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

A consulta acima inclui uma ordenação implícita sobre a desigualdade e é equivalente ao seguinte:

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