Kueri agregasi memproses data dari beberapa entri indeks untuk menampilkan satu nilai ringkasan.
Cloud Firestore mendukung kueri agregasi count()
. count()
memungkinkan Anda menentukan jumlah dokumen dalam koleksi atau kueri. Server menghitung jumlah dan hanya mentransmisikan hasil, yaitu bilangan bulat tunggal, kembali ke aplikasi Anda sehingga menghemat pembacaan dokumen yang ditagih dan byte yang ditransfer, dibandingkan dengan menjalankan kueri penuh.
Kueri agregasi bergantung pada konfigurasi indeks yang ada yang sudah digunakan kueri, dan diskalakan secara proporsional dengan jumlah entri indeks yang dipindai. Ini berarti agregasi set data berukuran kecil hingga sedang berfungsi dalam 20-40 milidetik, meskipun latensi meningkat seiring bertambahnya jumlah item yang dihitung.
Menggunakan agregasi count()
Lihat contoh data yang kami siapkan di Mendapatkan data.
Agregasi count()
berikut menampilkan jumlah total kota dalam
cities
koleksi.
API modular web
const coll = collection(db, "cities"); const snapshot = await getCountFromServer(coll); console.log('count: ', snapshot.data().count);
Swift
let query = db.collection("cities") let countQuery = query.count do { let snapshot = try await countQuery.getAggregation(source: .server) print(snapshot.count) } catch { print(error) }
Objective-C
FIRCollectionReference *query = [self.db collectionWithPath:@"cities"]; [query.count aggregationWithSource:FIRAggregateSourceServer completion:^(FIRAggregateQuerySnapshot *snapshot, NSError *error) { if (error != nil) { NSLog(@"Error fetching count: %@", error); } else { NSLog(@"Cities count: %@", snapshot.count); } }];
Java
Query query = db.collection("cities"); AggregateQuery countQuery = query.count(); countQuery.get(AggregateSource.SERVER).addOnCompleteListener(new OnCompleteListener<AggregateQuerySnapshot>() { @Override public void onComplete(@NonNull Task<AggregateQuerySnapshot> task) { if (task.isSuccessful()) { // Count fetched successfully AggregateQuerySnapshot snapshot = task.getResult(); Log.d(TAG, "Count: " + snapshot.getCount()); } else { Log.d(TAG, "Count failed: ", task.getException()); } } });
Kotlin+KTX
val query = db.collection("cities") val countQuery = query.count() countQuery.get(AggregateSource.SERVER).addOnCompleteListener { task -> if (task.isSuccessful) { // Count fetched successfully val snapshot = task.result Log.d(TAG, "Count: ${snapshot.count}") } else { Log.d(TAG, "Count failed: ", task.getException()) } }
Dart
// Returns number of documents in users collection db.collection("users").count().get().then( (res) => print(res.count), onError: (e) => print("Error completing: $e"), );
Go
Java
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);
Python
Agregasi count()
memperhitungkan semua filter pada kueri dan klausa limit
.
API modular web
const coll = collection(db, "cities"); const q = query(coll, where("state", "==", "CA")); const snapshot = await getCountFromServer(q); console.log('count: ', snapshot.data().count);
Swift
let query = db.collection("cities").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
FIRQuery *query = [[self.db collectionWithPath:@"cities"] queryWhereField:@"state" isEqualTo:@"CA"]; [query.count aggregationWithSource:FIRAggregateSourceServer completion:^(FIRAggregateQuerySnapshot *snapshot, NSError *error) { if (error != nil) { NSLog(@"Error fetching count: %@", error); } else { NSLog(@"Cities count: %@", snapshot.count); } }];
Java
Query query = db.collection("cities").whereEqualTo("state", "CA"); AggregateQuery countQuery = query.count(); countQuery.get(AggregateSource.SERVER).addOnCompleteListener(new OnCompleteListener<AggregateQuerySnapshot>() { @Override public void onComplete(@NonNull Task<AggregateQuerySnapshot> task) { if (task.isSuccessful()) { // Count fetched successfully AggregateQuerySnapshot snapshot = task.getResult(); Log.d(TAG, "Count: " + snapshot.getCount()); } else { Log.d(TAG, "Count failed: ", task.getException()); } } });
Kotlin+KTX
val query = db.collection("cities").whereEqualTo("state", "CA") val countQuery = query.count() countQuery.get(AggregateSource.SERVER).addOnCompleteListener { task -> if (task.isSuccessful) { // Count fetched successfully val snapshot = task.result Log.d(TAG, "Count: ${snapshot.count}") } else { Log.d(TAG, "Count failed: ", task.getException()) } }
Dart
// This also works with collectionGroup queries. db.collection("users").where("age", isGreaterThan: 10).count().get().then( (res) => print(res.count), onError: (e) => print("Error completing: $e"), );
Go
Java
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);
Python
Aturan Keamanan Cloud Firestore berfungsi sama pada kueri agregasi count()
seperti pada kueri normal yang menampilkan 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.
Batasan
Perhatikan batasan berikut pada kueri agregasi count()
:
Kueri agregasi
count()
saat ini hanya didukung melalui respons server langsung. Kueri hanya ditayangkan oleh backend Cloud Firestore, serta melewati cache lokal dan update yang di buffer. Perilaku ini sama dengan operasi yang dilakukan di dalam transaksi Cloud Firestore. Saat ini Anda tidak dapat menggunakan kuericount()
dengan pemroses real-time dan kueri offline.Jika agregasi
count()
tidak dapat diselesaikan dalam waktu 60 detik, errorDEADLINE_EXCEEDED
akan ditampilkan. Performa bergantung pada konfigurasi indeks Anda dan ukuran set data.Jika operasi tidak dapat diselesaikan dalam batas waktu 60 detik, solusi yang memungkinkan adalah menggunakan penghitung untuk set data besar.
Agregasi
count()
membaca dari entri indeks, dan hanya menghitung kolom terindeks .Menambahkan
OrderBy
klausa ke kueri akan membatasi jumlah pada dokumen tempat kolom pengurutan berada.
Harga
Harga untuk count()
bergantung pada jumlah entri indeks yang cocok dengan kueri. Anda akan dikenai biaya dalam jumlah kecil untuk pembacaan dalam jumlah yang sesuai.
Lihat informasi harga yang lebih mendetail.