Order and limit data
Firestore provides powerful query functionality for specifying which
documents you want to retrieve from a collection. These queries can also be used
with either get()
or addSnapshotListener()
, as described in Get
Data
.
Order and limit data
By default, a query retrieves all documents that satisfy the query in ascending
order by document ID. You can specify the sort order for your data using orderBy()
, and you can limit the number of documents retrieved using limit()
. If you specify a limit()
, the value must be greater than or equal
to zero.
For example, you could query for the first 3 cities alphabetically with:
Web version 9
import { query , orderBy , limit } from "firebase/firestore" ; const q = query ( citiesRef , orderBy ( "name" ), limit ( 3 ));
Web version 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
To authenticate to Firestore, set up Application Default Credentials. For more information, see Set up authentication for a local development environment .
Unity
Query query = citiesRef . OrderBy ( "Name" ). Limit ( 3 );
C#
Ruby
You could also sort in descending order to get the last 3 cities:
Web version 9
import { query , orderBy , limit } from "firebase/firestore" ; const q = query ( citiesRef , orderBy ( "name" , "desc" ), limit ( 3 ));
Web version 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
To authenticate to Firestore, set up Application Default Credentials. For more information, see Set up authentication for a local development environment .
Unity
Query query = citiesRef . OrderByDescending ( "Name" ). Limit ( 3 );
C#
Ruby
You can also order by multiple fields. For example, if you wanted to order by state, and within each state order by population in descending order:
Web version 9
import { query , orderBy } from "firebase/firestore" ; const q = query ( citiesRef , orderBy ( "state" ), orderBy ( "population" , "desc" ));
Web version 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
To authenticate to Firestore, set up Application Default Credentials. For more information, see Set up authentication for a local development environment .
Unity
Query query = citiesRef . OrderBy ( "State" ). OrderByDescending ( "Population" );
C#
Ruby
You can combine where()
filters with orderBy()
and limit()
. In the
following example, the queries define a population threshold, sort by population
in ascending order, and return only the first few results that exceed the
threshold:
Web version 9
import { query , where , orderBy , limit } from "firebase/firestore" ; const q = query ( citiesRef , where ( "population" , ">" , 100000 ), orderBy ( "population" ), limit ( 2 ));
Web version 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
To authenticate to Firestore, set up Application Default Credentials. For more information, see Set up authentication for a local development environment .
Unity
Query query = citiesRef . WhereGreaterThan ( "Population" , 2500000 ) . OrderBy ( "Population" ) . Limit ( 2 );
C#
Ruby
However, if you have a filter with a range comparison ( <
, <=
, >
, >=
),
your first ordering must be on the same field, see the list of orderBy()
limitations below.
Limitations
Note the following restriction for orderBy()
clauses:
- An
orderBy()
clause also filters for existence of the given fields . The result set will not include documents that do not contain the given fields.
orderBy
and existence
When you order a query by a given field, the query can return only the documents where the order-by field exists.
For example, the following query would not return any documents where the population
field is not set, even if they otherwise meet the query filters.
Java
db . collection ( "cities" ). whereEqualTo ( "country" , “ USA ” ). orderBy ( “ population ” );
A related effect applies to inequalities. A query with an inequality filter
on a field also implies ordering by that field. The following
query does not return documents without a population
field even
if country = USA
in that document . As a workaround, you can execute
separate queries for each ordering or you can assign a value for all fields
that you order by.
Java
db . collection ( “ cities ” ). where ( or ( “ country ” , USA ” ), greaterThan ( “ population ” , 250000 ));
The query above includes an implied order-by on the inequality and is equivalent to the following:
Java
db . collection ( “ cities ” ). where ( or ( “ country ” , USA ” ), greaterThan ( “ population ” , 250000 )). orderBy ( “ population ” );