multi query and pagination with firestore
Check this example App using FireStore with Angular 8 app having pagination
using queries
limit()
orderBy()
startAt()
endBefore()
startAfter()
There has documentation at firebase on Pagination & Query and query data. We have to use the startAt() or startAfter() methods to define the start point for a query. Similarly, use the endAt() or endBefore() methods to define an end point for your query results.
Example: To get all cities with a population >= 1,000,000, ordered by population,
db.collection("cities")
.orderBy("population")
.startAt(1000000);
and to get all cities with a population <= 1,000,000, ordered by population,
db.collection("cities")
.orderBy("population")
.endAt(1000000);
So pagination should be done using this method like,
// Construct query for first 25 cities, ordered by population
Query first = db.collection("cities")
.orderBy("population")
.limit(25);
first.get()
.addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
@Override
public void onSuccess(QuerySnapshot documentSnapshots) {
// ...
// Get the last visible document
DocumentSnapshot lastVisible = documentSnapshots.getDocuments()
.get(documentSnapshots.size() -1);
// Construct a new query starting at this document,
// get the next 25 cities.
Query next = db.collection("cities")
.orderBy("population")
.startAfter(lastVisible)
.limit(25);
// Use the query for pagination
// ...
}
});
A Firestore query can only have a single range condition.
From the documentation on queries:
You can combine
where()
filters withorderBy()
andlimit()
.However, if you have a filter with a range comparison (
<
,<=
,>
,>=
), your first ordering must be on the same field:Invalid: Range filter and first orderBy on different fields
citiesRef.where("population", ">", 100000).orderBy("country")