Ordene e limite os dados

O Firestore oferece uma funcionalidade de consulta avançada para especificar os documentos que quer obter de uma coleção. Estas consultas também podem ser usadas com get() ou addSnapshotListener(), conforme descrito em Obter dados.

Ordene e limite os dados

Por predefinição, uma consulta obtém todos os documentos que satisfazem a consulta por ordem ascendente do ID do documento. Pode especificar a ordem de ordenação dos seus dados através de orderBy() e pode limitar o número de documentos obtidos através de limit(). Se especificar um limit(), o valor tem de ser igual ou superior a zero.

Por exemplo, pode consultar as 3 primeiras cidades por ordem alfabética com:

Versão Web 9

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

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

Versão Web 8

citiesRef.orderBy("name").limit(3);
Swift
Nota: este produto não está disponível em alvos do watchOS e de App Clips.
citiesRef.order(by: "name").limit(to: 3)
Objective-C
Nota: este produto não está disponível em alvos do watchOS e de App Clips.
[[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
(assíncrono)
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 se autenticar no Firestore, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para um ambiente de desenvolvimento 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)

Também pode ordenar por ordem descendente para ver as 3 cidades mais recentes:

Versão Web 9

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

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

Versão Web 8

citiesRef.orderBy("name", "desc").limit(3);
Swift
Nota: este produto não está disponível em alvos do watchOS e de App Clips.
citiesRef.order(by: "name", descending: true).limit(to: 3)
Objective-C
Nota: este produto não está disponível em alvos do watchOS e de App Clips.
[[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
(assíncrono)
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 se autenticar no Firestore, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para um ambiente de desenvolvimento 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)

Também pode ordenar por vários campos. Por exemplo, se quiser ordenar por estado e, em cada estado, ordenar por população por ordem descendente:

Versão Web 9

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

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

Versão Web 8

citiesRef.orderBy("state").orderBy("population", "desc");
Swift
Nota: este produto não está disponível em alvos do watchOS e de App Clips.
citiesRef
  .order(by: "state")
  .order(by: "population", descending: true)
Objective-C
Nota: este produto não está disponível em alvos do watchOS e de App Clips.
[[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
(assíncrono)
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 se autenticar no Firestore, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para um ambiente de desenvolvimento 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")

Pode combinar filtros where() com orderBy() e limit(). No exemplo seguinte, as consultas definem um limite da população, ordenam por população por ordem ascendente e devolvem apenas os primeiros resultados que excedem o limite:

Versão Web 9

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

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

Versão Web 8

citiesRef.where("population", ">", 100000).orderBy("population").limit(2);
Swift
Nota: este produto não está disponível em alvos do watchOS e de App Clips.
citiesRef
  .whereField("population", isGreaterThan: 100000)
  .order(by: "population")
  .limit(to: 2)
Objective-C
Nota: este produto não está disponível em alvos do watchOS e de App Clips.
[[[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
(assíncrono)
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 se autenticar no Firestore, configure as Credenciais padrão da aplicação. Para mais informações, consulte o artigo Configure a autenticação para um ambiente de desenvolvimento 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)

No entanto, se tiver um filtro com uma comparação de intervalo (<, <=, >, >=), a primeira ordenação tem de ser no mesmo campo. Consulte a lista de orderBy() limitações abaixo.

Limitações

Tenha em atenção a seguinte restrição para as cláusulas orderBy():

orderBy e existência

Quando ordena uma consulta por um determinado campo, a consulta só pode devolver os documentos onde o campo de ordenação existe.

Por exemplo, a seguinte consulta não devolve documentos em que o campo population não está definido, mesmo que cumpram os filtros da consulta.

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

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

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

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

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