Ikuti semua informasi yang diumumkan di Firebase Summit, dan pelajari bagaimana Firebase dapat membantu Anda mempercepat pengembangan aplikasi dan menjalankan aplikasi dengan percaya diri. Pelajari Lebih Lanjut

Hitung dokumen dengan kueri agregasi

Tetap teratur dengan koleksi Simpan dan kategorikan konten berdasarkan preferensi Anda.

Kueri agregasi memproses data dari beberapa entri indeks untuk mengembalikan satu nilai ringkasan.

Cloud Firestore mendukung kueri agregasi count() . count() memungkinkan Anda menentukan jumlah dokumen dalam kumpulan atau kueri. Server menghitung jumlah, dan mengirimkan hanya hasilnya, satu bilangan bulat, kembali ke aplikasi Anda, menghemat pembacaan dokumen yang ditagih dan byte yang ditransfer, dibandingkan dengan menjalankan kueri lengkap.

Kueri agregasi mengandalkan konfigurasi indeks yang sudah ada yang sudah digunakan oleh kueri Anda, dan menskalakan secara proporsional dengan jumlah entri indeks yang dipindai. Ini berarti bahwa agregasi kumpulan data berukuran kecil hingga sedang bekerja dalam waktu 20-40 md, meskipun latensi meningkat seiring dengan jumlah item yang dihitung.

Gunakan agregasi count()

Lihat contoh data yang kami atur di Mendapatkan data .

Agregasi count() berikut mengembalikan jumlah total kota dalam kumpulan cities .

Web version 9

const coll = collection(db, "cities");
const snapshot = await getCountFromServer(coll);
console.log('count: ', snapshot.data().count);
    
Cepat
let collection = db.collection("cities")
let countQuery = collection.count
do {
  let snapshot = try await countQuery.getAggregation(source: .server)
  print(snapshot.count)
} catch {
  print(error);
}
      
Objective-C
FIRCollectionReference* collection = [db collectionWithPath:@"cities"];
[collection.count
  aggregationWithSource:FIRAggregateSourceServer
  completion:^(FIRAggregateQuerySnapshot *snapshot, NSError *error) {
    if (error == nil) {
        NSLog(@"Cities count: %@", snapshot.count);
    } else {
        NSLog(@"Error fetching count: %@", error);
    }
  }
];
      

Kotlin+KTX

val collection = db.collection("cities")
val countQuery = collection.count()
countQuery.get(AggregateSource.SERVER).addOnCompleteListener { task ->
  if (task.isSuccessful) {
    val snapshot = task.result
    Log.d(TAG, "Count: ${snapshot.count}")
  } else {
    Log.d(TAG, "Count failed: ", task.getException())
  }
}
      

Java

CollectionReference collection = db.collection("cities");
AggregateQuery countQuery = collection.count();
countQuery.get(AggregateSource.SERVER).addOnCompleteListener(task -> {
  if (task.isSuccessful()) {
    AggregateQuerySnapshot snapshot = task.getResult();
    Log.d(TAG, "Count: " + snapshot.getCount());
  } else {
    Log.d(TAG, "Count failed: ", task.getException());
  }
});
      
Jawa
CollectionReference collection = db.collection("cities");
AggregateQuerySnapshot snapshot = collection.count().get().get();
System.out.println("Count: " + snapshot.getCount());
      
Node.js
const collectionRef = db.collection('cities');
const snapshot = await collectionRef.count().get();
console.log(snapshot.data().count);
      

Agregasi count() memperhitungkan filter apa pun pada kueri dan klausa limit apa pun. Misalnya, agregasi berikut mengembalikan hitungan jumlah kota di mana state sama dengan CA .

Web version 9

const coll = collection(db, "cities");
const query_ = query(coll, where('state', '==', 'CA'));
const snapshot = await getCountFromServer(query_);
console.log('count: ', snapshot.data().count);
    
Cepat
let collection = db.collection("cities")
let query = collection.whereField("state", isEqualTo: "CA")
let countQuery = query.count
do {
  let snapshot = try await countQuery.getAggregation(source: .server)
  print(snapshot.count)
} catch {
  print(error);
}
      
Objective-C
FIRCollectionReference* collection = [db collectionWithPath:@"cities"];
FIRQuery* query = [collection queryWhereField:@"state" isEqualTo:@"CA"];
[query.count
  aggregationWithSource:FIRAggregateSourceServer
  completion:^(FIRAggregateQuerySnapshot *snapshot, NSError *error) {
    if (error == nil) {
        NSLog(@"Cities count: %@", snapshot.count);
    } else {
        NSLog(@"Error fetching count: %@", error);
    }
  }
];
      

Kotlin+KTX

val collection = db.collection("cities")
val query = collection.whereEqualTo("state", "CA")
val countQuery = query.count()
countQuery.get(AggregateSource.SERVER).addOnCompleteListener { task ->
  if (task.isSuccessful) {
    val snapshot = task.result
    Log.d(TAG, "Count: ${snapshot.count}")
  } else {
    Log.d(TAG, "Count failed: ", task.getException())
  }
}
      

Java

CollectionReference collection = db.collection("cities");
Query query = collection.whereEqualTo("state", "CA");
AggregateQuery countQuery = query.count();
countQuery.get(AggregateSource.SERVER).addOnCompleteListener(task -> {
  if (task.isSuccessful()) {
    AggregateQuerySnapshot snapshot = task.getResult();
    Log.d(TAG, "Count: " + snapshot.getCount());
  } else {
    Log.d(TAG, "Count failed: ", task.getException());
  }
});
      
Jawa
CollectionReference collection = db.collection("cities");
Query query = collection.whereEqualTo("state", "CA");
AggregateQuerySnapshot snapshot = query.count().get().get();
System.out.println("Count: " + snapshot.getCount());
      
Node.js
const collectionRef = db.collection('cities');
const query = collectionRef.where('state', '==', 'CA');
const snapshot = await query.count().get();
console.log(snapshot.data().count);
      

Aturan Keamanan Cloud Firestore berfungsi sama pada kueri agregasi count() seperti pada kueri normal yang mengembalikan dokumen. Dengan kata lain, jika dan hanya jika aturan Anda mengizinkan klien untuk mengeksekusi kueri koleksi atau grup koleksi tertentu, klien juga dapat melakukan agregasi count() pada kueri tersebut. Pelajari lebih lanjut cara Aturan Keamanan Cloud Firestore berinteraksi dengan kueri .

Keterbatasan

Perhatikan batasan berikut pada kueri agregasi count() :

  • kueri agregasi count() saat ini hanya didukung melalui respons server langsung. Kueri hanya dilayani oleh backend Cloud Firestore, melewati cache lokal dan update yang di-buffer. Perilaku ini identik dengan operasi yang dilakukan di dalam transaksi Cloud Firestore . Saat ini Anda tidak dapat menggunakan kueri count() dengan pendengar real-time dan kueri offline.

  • Jika agregasi count() tidak dapat diselesaikan dalam waktu 60 detik, ia mengembalikan kesalahan DEADLINE_EXCEEDED . Performa bergantung pada konfigurasi indeks Anda dan ukuran kumpulan data.

    Jika operasi tidak dapat diselesaikan dalam tenggat waktu 60 detik, solusi yang mungkin adalah menggunakan penghitung untuk kumpulan data besar.

  • Agregasi count() membaca dari entri indeks dan hanya menghitung bidang yang diindeks.

  • Menambahkan klausa OrderBy ke kueri membatasi hitungan ke entitas tempat properti pengurutan berada.

Harga

Harga untuk count() bergantung pada jumlah entri indeks yang cocok dengan kueri. Anda dikenai biaya sejumlah kecil bacaan untuk sejumlah besar entri yang cocok.

Lihat informasi harga lebih detail.