Toplama sorgusu, tek bir özet değeri döndürmek için birden çok dizin girişindeki verileri işler.
Cloud Firestore aşağıdaki toplama sorgularını destekler:
-
count()
-
sum()
-
average()
Cloud Firestore, toplamayı hesaplar ve yalnızca sonucu uygulamanıza iletir. Uygulamanızda tam bir sorgu yürütmek ve toplamayı hesaplamakla karşılaştırıldığında, toplama sorguları hem faturalandırılan belge okumalarından hem de aktarılan bayt sayısından tasarruf sağlar.
Toplama sorguları, sorgularınızın halihazırda kullandığı mevcut dizin yapılandırmasına dayanır ve taranan dizin girişi sayısına orantılı olarak ölçeklenir. Toplamadaki öğe sayısı arttıkça gecikme artar.
count()
toplamasını kullanın
count()
toplama sorgusu, bir koleksiyon veya sorgudaki belge sayısını belirlemenizi sağlar.
Veri alma bölümünde ayarladığımız örnek verilere bakın.
Aşağıdaki count()
toplaması, cities
koleksiyonundaki toplam şehir sayısını döndürür.
Web modular API
const coll = collection(db, "cities"); const snapshot = await getCountFromServer(coll); console.log('count: ', snapshot.data().count);
Süratli
let query = db.collection("cities") let countQuery = query.count do { let snapshot = try await countQuery.getAggregation(source: .server) print(snapshot.count) } catch { print(error) }
Amaç-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"), );
Gitmek
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
count()
toplaması, sorgudaki filtreleri ve limit
cümlelerini hesaba katar.
Web modular API
const coll = collection(db, "cities"); const q = query(coll, where("state", "==", "CA")); const snapshot = await getCountFromServer(q); console.log('count: ', snapshot.data().count);
Süratli
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) }
Amaç-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"), );
Gitmek
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
sum()
toplamasını kullanın
Belirli bir sorguyla eşleşen sayısal değerlerin toplam toplamını döndürmek için sum()
toplamasını kullanın; örneğin:
Web modular API
const coll = collection(firestore, 'cities'); const snapshot = await getAggregateFromServer(coll, { totalPopulation: sum('population') }); console.log('totalPopulation: ', snapshot.data().totalPopulation);
Java
collection = db.collection("cities"); snapshot = collection.aggregate(sum("population")).get().get(); System.out.println("Sum: " + snapshot.get(sum("population")));
Node.js
const coll = firestore.collection('cities'); const sumAggregateQuery = coll.aggregate({ totalPopulation: AggregateField.sum('population'), }); const snapshot = await sumAggregateQuery.get(); console.log('totalPopulation: ', snapshot.data().totalPopulation);
sum()
toplaması, sorgudaki tüm filtreleri ve sınırlama tümcelerini dikkate alır; örneğin:
Web modular API
const coll = collection(firestore, 'cities'); const q = query(coll, where('capital', '==', true)); const snapshot = await getAggregateFromServer(q, { totalPopulation: sum('population') }); console.log('totalPopulation: ', snapshot.data().totalPopulation);
Java
collection = db.collection("cities"); query = collection.whereEqualTo("state", "CA"); snapshot = query.aggregate(sum("population")).get().get(); System.out.println("Sum: " + snapshot.get(sum("population")));
Node.js
const coll = firestore.collection('cities'); const q = coll.where("capital", "==", true); const sumAggregateQuery = q.aggregate({ totalPopulation: AggregateField.sum('population'), }); const snapshot = await sumAggregateQuery.get(); console.log('totalPopulation: ', snapshot.data().totalPopulation);
average()
toplamasını kullanın
Belirli bir sorguyla eşleşen sayısal değerlerin ortalamasını döndürmek için average()
toplamasını kullanın; örneğin:
Web modular API
const coll = collection(firestore, 'cities'); const snapshot = await getAggregateFromServer(coll, { averagePopulation: average('population') }); console.log('averagePopulation: ', snapshot.data().averagePopulation);
Java
collection = db.collection("cities"); snapshot = collection.aggregate(average("population")).get().get(); System.out.println("Average: " + snapshot.get(average("population")));
Node.js
const coll = firestore.collection('cities'); const averageAggregateQuery = coll.aggregate({ averagePopulation: AggregateField.average('population'), }); const snapshot = await averageAggregateQuery.get(); console.log('averagePopulation: ', snapshot.data().averagePopulation);
average()
toplaması, sorgudaki filtreleri ve limit cümleciklerini hesaba katar; örneğin:
Web modular API
const coll = collection(firestore, 'cities'); const q = query(coll, where('capital', '==', true)); const snapshot = await getAggregateFromServer(q, { averagePopulation: average('population') }); console.log('averagePopulation: ', snapshot.data().averagePopulation);
Java
collection = db.collection("cities"); query = collection.whereEqualTo("state", "CA"); snapshot = query.aggregate(average("population")).get().get(); System.out.println("Average: " + snapshot.get(average("population")));
Node.js
const coll = firestore.collection('cities'); const q = coll.where("capital", "==", true); const averageAggregateQuery = q.aggregate({ averagePopulation: AggregateField.average('population'), }); const snapshot = await averageAggregateQuery.get(); console.log('averagePopulation: ', snapshot.data().averagePopulation);
Bir sorguda birden çok toplamayı hesaplama
Birden fazla toplamayı tek bir toplama hattında birleştirebilirsiniz. Bu, gereken dizin okuma sayısını azaltabilir. Sorgu birden çok alanda toplama içeriyorsa sorgu bileşik dizin gerektirebilir. Bu durumda Cloud Firestore bir dizin önerir.
Aşağıdaki örnek, tek bir toplama sorgusunda birden çok toplama gerçekleştirir:
Web modular API
const coll = collection(firestore, 'cities'); const snapshot = await getAggregateFromServer(coll, { countOfDocs: count(), totalPopulation: sum('population'), averagePopulation: average('population') }); console.log('countOfDocs: ', snapshot.data().countOfDocs); console.log('totalPopulation: ', snapshot.data().totalPopulation); console.log('averagePopulation: ', snapshot.data().averagePopulation);
Java
collection = db.collection("cities"); query = collection.whereEqualTo("state", "CA"); AggregateQuery aggregateQuery = query.aggregate(count(), sum("population"), average("population")); snapshot = aggregateQuery.get().get(); System.out.println("Count: " + snapshot.getCount()); System.out.println("Sum: " + snapshot.get(sum("population"))); System.out.println("Average: " + snapshot.get(average("population")));
Node.js
const coll = firestore.collection('cities'); const aggregateQuery = coll.aggregate({ countOfDocs: AggregateField.count(), totalPopulation: AggregateField.sum('population'), averagePopulation: AggregateField.average('population') }); const snapshot = await aggregateQuery.get(); console.log('countOfDocs: ', snapshot.data().countOfDocs); console.log('totalPopulation: ', snapshot.data().totalPopulation); console.log('averagePopulation: ', snapshot.data().averagePopulation);
Birden çok toplamaya sahip sorgular yalnızca her toplamadaki tüm alanları içeren belgeleri içerir. Bu durum her bir toplamanın ayrı ayrı yapılmasından farklı sonuçlara yol açabilir.
Toplama sorguları için güvenlik kuralları
Cloud Firestore Güvenlik Kuralları, toplama sorgularında, belgeleri döndüren sorgularda olduğu gibi çalışır. Başka bir deyişle, yalnızca kurallarınız istemcilerin belirli koleksiyon veya koleksiyon grubu sorgularını yürütmesine izin veriyorsa, istemciler de bu sorgular üzerinde toplama işlemini gerçekleştirebilir. Cloud Firestore Güvenlik Kurallarının sorgularla nasıl etkileşim kurduğu hakkında daha fazla bilgi edinin.
Davranış ve sınırlamalar
Toplama sorgularıyla çalışırken aşağıdaki davranış ve sınırlamalara dikkat edin:
Toplama sorgularını gerçek zamanlı dinleyicilerle ve çevrimdışı sorgularla kullanamazsınız. Toplama sorguları yalnızca doğrudan sunucu yanıtı aracılığıyla desteklenir. Sorgular yalnızca Cloud Firestore arka ucu tarafından sunulur; yerel önbellek ve ara belleğe alınmış güncellemeler atlanır. Bu davranış, Cloud Firestore işlemleri içinde gerçekleştirilen işlemlerle aynıdır.
Bir toplama 60 saniye içinde çözülemezse
DEADLINE_EXCEEDED
hatası döndürür. Performans, dizin yapılandırmanıza ve veri kümesinin boyutuna bağlıdır.İşlem 60 saniyelik süre içinde tamamlanamazsa, büyük veri kümeleri için sayaçların kullanılması olası bir geçici çözüm olabilir.
Toplama sorguları dizin girişlerinden okunur ve yalnızca dizine alınmış alanları içerir.
Bir toplama sorgusuna
OrderBy
yan tümcesinin eklenmesi, toplamayı sıralama alanının mevcut olduğu belgelerle sınırlandırır.sum()
veaverage()
toplamaları için sayısal olmayan değerler göz ardı edilir.sum()
veaverage()
toplamaları yalnızca tamsayı değerleri ve kayan noktalı sayı değerlerini dikkate alır.Tek bir sorguda birden fazla toplamayı birleştirirken,
sum()
veaverage()
nın sayısal olmayan değerleri yok saydığını,count()
ise sayısal olmayan değerleri içerdiğini unutmayın.Farklı alanlardaki toplamaları birleştirirseniz hesaplama yalnızca tüm bu alanları içeren belgeleri içerir.
Fiyatlandırma
Toplama sorgularının fiyatlandırması, sorguyla eşleşen dizin girişi sayısına bağlıdır. Çok sayıda eşleşen giriş için az sayıda okuma ücreti ödersiniz.
Daha ayrıntılı fiyatlandırma bilgilerine bakın.