CodeBlanks Logo Icon CodeBlanks

Sorgu ve where

where ile filtreli sorgu yapmayı öğrenirsin.

where ile filtreleme

where metodu, koleksiyondaki belgeleri bir alana göre filtreler. Örneğin where('sender', isEqualTo: 'Ali') yalnızca gönderen Ali olan belgeleri döndürür. where bir Query döndürür; bu nesne üzerinde snapshots veya get çağrılır.

db.collection('messages')
  .where('sender', isEqualTo: 'Ali')
  .snapshots();

Zincirleme sorgular

Birden çok where çağrısı zincirleyerek daha spesifik filtreler oluşturabilirsin. orderBy ile sıralama, limit ile belge sayısını kısıtlayabilirsin. Sorgu nesnesi değişmez olduğu için her çağrı yeni bir sorgu döndürür.

db.collection('messages')
  .where('sender', isEqualTo: 'Ali')
  .where('read', isEqualTo: false)
  .snapshots();

Uygulama Filtreli sorgu dinle

Db al. 'messages' koleksiyonunda where('sender', isEqualTo: 'Ali') filtresini uygula ve snapshots akışını dinle. Her snapshot'ta belge sayısını yazdır. 10 milisaniye bekle.

Başlangıç kodu

main.dart
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
}

Örnek çözüm

main.dart
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));
}

Beklenen çıktı

1

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 where('sender', isEqualTo: 'Ali') ne yapar?

  • Tüm belgeleri siler
  • Yalnızca sender alanı Ali olan belgeleri seçer Doğru cevap
  • Belgeleri tarihe göre sıralar
  • Yeni bir koleksiyon oluşturur

Açıklama: where isEqualTo ile verilen değere eşit olan belgeleri filtreler; sıralama veya silme yapmaz.

2 where filtresi ekle

Soru
db.collection('messages')
  .____('sender', isEqualTo: 'Ali')
  .snapshots();
Cevap
db.collection('messages')
  .where('sender', isEqualTo: 'Ali')
  .snapshots();

Açıklama: Belgeleri bir alana göre filtrelemek için where metodu kullanılır; alan adı ve koşul parametre olarak verilir.

3 Sorgu parçaları

Kavram Anlamı
where Alan ile filtreler
isEqualTo Eşitlik koşulu
Query Sorgu nesnesi
snapshots Akış üretir

İleri seviye bölümündeki tüm dersler