Query and where
- Flutter course
- Advanced
- Lesson 24/69
- 4 min
Filter queries with where.
Filtering with where
The where method filters the documents in a collection by a field. For example where('sender', isEqualTo: 'Ali') returns only documents whose sender is Ali. where returns a Query; you call snapshots or get on it.
db.collection('messages')
.where('sender', isEqualTo: 'Ali')
.snapshots();Chained queries
You can chain multiple where calls to build more specific filters. You can add ordering with orderBy and limit the document count with limit. The query object is immutable, so each call returns a new query.
db.collection('messages')
.where('sender', isEqualTo: 'Ali')
.where('read', isEqualTo: false)
.snapshots();Practice Listen to a filtered query
Get db. Apply where('sender', isEqualTo: 'Ali') on the 'messages' collection and listen to the snapshots stream. Print the document count on each snapshot. Wait 10 milliseconds.
Starter code
class QueryDocumentSnapshot {
final Map<String, dynamic> data;
QueryDocumentSnapshot(this.data);
}
class QuerySnapshot {
final List<QueryDocumentSnapshot> docs;
QuerySnapshot(this.docs);
}
class Query {
final List<QueryDocumentSnapshot> docs;
Query(this.docs);
Stream<QuerySnapshot> snapshots() async* {
yield QuerySnapshot(docs);
}
}
class CollectionReference {
final String name;
CollectionReference(this.name);
Query where(String field, {required String isEqualTo}) {
return Query([
QueryDocumentSnapshot({'sender': isEqualTo, 'text': 'Merhaba'}),
]);
}
}
class FirebaseFirestore {
static final FirebaseFirestore instance = FirebaseFirestore._();
FirebaseFirestore._();
CollectionReference collection(String name) => CollectionReference(name);
}
void main() async {
// where ile filtrele, snapshots dinle
// her snapshot'ta belge sayısını yazdır
}Sample solution
class QueryDocumentSnapshot {
final Map<String, dynamic> data;
QueryDocumentSnapshot(this.data);
}
class QuerySnapshot {
final List<QueryDocumentSnapshot> docs;
QuerySnapshot(this.docs);
}
class Query {
final List<QueryDocumentSnapshot> docs;
Query(this.docs);
Stream<QuerySnapshot> snapshots() async* {
yield QuerySnapshot(docs);
}
}
class CollectionReference {
final String name;
CollectionReference(this.name);
Query where(String field, {required String isEqualTo}) {
return Query([
QueryDocumentSnapshot({'sender': isEqualTo, 'text': 'Merhaba'}),
]);
}
}
class FirebaseFirestore {
static final FirebaseFirestore instance = FirebaseFirestore._();
FirebaseFirestore._();
CollectionReference collection(String name) => CollectionReference(name);
}
void main() async {
final db = FirebaseFirestore.instance;
db.collection('messages')
.where('sender', isEqualTo: 'Ali')
.snapshots()
.listen((snap) {
print(snap.docs.length);
});
await Future.delayed(Duration(milliseconds: 10));
}Expected output
1
Questions and answers
Review the lesson questions together with their answers. To test yourself, solve the lesson interactively.
1 What does where('sender', isEqualTo: 'Ali') do?
- Deletes all documents
- Selects only documents whose sender field is Ali Correct answer
- Orders documents by date
- Creates a new collection
Explanation: where with isEqualTo filters documents equal to the given value; it does not order or delete.
2 Add a where filter
db.collection('messages')
.____('sender', isEqualTo: 'Ali')
.snapshots();
db.collection('messages')
.where('sender', isEqualTo: 'Ali')
.snapshots();
Explanation: To filter documents by a field you use the where method; the field name and condition are given as parameters.
3 Query parts
| Term | Meaning |
|---|---|
where |
Filters by a field |
isEqualTo |
Equality condition |
Query |
Query object |
snapshots |
Produces a stream |