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 kuericount()
dengan pendengar real-time dan kueri offline.Jika agregasi
count()
tidak dapat diselesaikan dalam waktu 60 detik, ia mengembalikan kesalahanDEADLINE_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.