یک کوئری تجمیع داده ها را از چندین ورودی فهرست پردازش می کند تا یک مقدار خلاصه واحد را برگرداند.
Cloud Firestore از پرس و جوهای تجمع زیر پشتیبانی می کند:
-
count()
-
sum()
-
average()
Cloud Firestore تجمع را محاسبه می کند و تنها نتیجه را به برنامه شما ارسال می کند. در مقایسه با اجرای یک پرس و جو کامل و محاسبه تجمع در برنامه شما، جستارهای تجمیع در هر دو خواندن سند صورتحساب و بایت های منتقل شده صرفه جویی می کنند.
جستارهای تجمیع بر پیکربندی فهرست موجودی که عبارتهای جستجوی شما قبلاً استفاده میکردند متکی هستند و متناسب با تعداد ورودیهای فهرست اسکن شده مقیاس میشوند. تأخیر با تعداد اقلام در تجمع افزایش می یابد.
از تجمع count()
استفاده کنید
پرس و جوی جمع آوری count()
به شما امکان می دهد تعداد اسناد را در یک مجموعه یا پرس و جو تعیین کنید.
به نمونه دادهای که در دریافت داده تنظیم کردهایم مراجعه کنید.
انباشت count()
زیر تعداد کل شهرهای مجموعه cities
را برمی گرداند.
Web modular API
const coll = collection(db, "cities"); const snapshot = await getCountFromServer(coll); console.log('count: ', snapshot.data().count);
سریع
let query = db.collection("cities") let countQuery = query.count do { let snapshot = try await countQuery.getAggregation(source: .server) print(snapshot.count) } catch { print(error) }
هدف-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"), );
برو
جاوا
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);
پایتون
تجمیع count()
هر فیلتری را در پرس و جو و هر بند limit
را در نظر می گیرد.
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);
سریع
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) }
هدف-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"), );
برو
جاوا
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);
پایتون
از جمع sum()
استفاده کنید
از تجمیع sum()
برای برگرداندن مجموع مقادیر عددی منطبق با یک پرس و جو استفاده کنید - برای مثال:
Web modular API
const coll = collection(firestore, 'cities'); const snapshot = await getAggregateFromServer(coll, { totalPopulation: sum('population') }); console.log('totalPopulation: ', snapshot.data().totalPopulation);
جاوا
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()
هر فیلتری را در پرس و جو و هر بند حد را در نظر می گیرد - به عنوان مثال:
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);
جاوا
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()
استفاده کنید
از تجمیع average()
برای برگرداندن میانگین مقادیر عددی که با یک پرس و جوی داده شده مطابقت دارند، استفاده کنید - برای مثال:
Web modular API
const coll = collection(firestore, 'cities'); const snapshot = await getAggregateFromServer(coll, { averagePopulation: average('population') }); console.log('averagePopulation: ', snapshot.data().averagePopulation);
جاوا
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()
هر فیلتری را در پرس و جو و هر شرط محدودی را در نظر می گیرد - به عنوان مثال:
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);
جاوا
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);
چندین تجمع را در یک پرس و جو محاسبه کنید
شما می توانید چندین تجمع را در یک خط لوله تجمیع ترکیب کنید. این می تواند تعداد خواندن فهرست مورد نیاز را کاهش دهد. اگر پرس و جو شامل تجمیع در چندین فیلد باشد، ممکن است پرس و جو به یک نمایه ترکیبی نیاز داشته باشد. در آن صورت، Cloud Firestore یک شاخص را پیشنهاد می کند.
مثال زیر چندین تجمیع را در یک کوئری تجمیع انجام می دهد:
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);
جاوا
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);
پرس و جوهایی با چند تجمیع فقط شامل اسنادی می شوند که شامل تمام فیلدهای هر تجمیع هستند. این ممکن است به نتایج متفاوتی از انجام هر تجمیع جداگانه منجر شود.
قوانین امنیتی برای پرس و جوهای تجمع
قوانین امنیتی Cloud Firestore روی جستارهای انباشتگی به همان صورت روی جستارهایی که اسناد را برمی گرداند کار می کند. به عبارت دیگر، اگر و تنها در صورتی که قوانین شما به مشتریان اجازه می دهد مجموعه یا مجموعه مجموعه پرس و جوهای معینی را اجرا کنند، کلاینت ها نیز می توانند تجمیع آن کوئری ها را انجام دهند. درباره نحوه تعامل قوانین امنیتی Cloud Firestore با جستارها بیشتر بیاموزید.
رفتار و محدودیت ها
همانطور که با پرس و جوهای تجمع کار می کنید، به رفتار و محدودیت های زیر توجه کنید:
شما نمی توانید از پرس و جوهای تجمیع با شنوندگان بلادرنگ و پرس و جوهای آفلاین استفاده کنید. پرس و جوهای تجمع فقط از طریق پاسخ مستقیم سرور پشتیبانی می شوند. پرس و جوها فقط توسط پشتیبان Cloud Firestore ارائه می شوند و از حافظه پنهان محلی و هرگونه به روز رسانی بافر صرف نظر می شود. این رفتار مشابه عملیات انجام شده در تراکنش های Cloud Firestore است.
اگر تجمعی نتواند در عرض 60 ثانیه حل شود، یک خطای
DEADLINE_EXCEEDED
برمیگرداند. عملکرد به پیکربندی شاخص شما و اندازه مجموعه داده بستگی دارد.اگر عملیات در مهلت 60 ثانیه تکمیل نشود، یک راه حل ممکن استفاده از شمارنده برای مجموعه داده های بزرگ است.
پرس و جوهای تجمع از ورودی های فهرست خوانده می شوند و فقط شامل فیلدهای نمایه شده می شوند.
افزودن یک بند
OrderBy
به پرس و جوی تجمع، تجمع را به اسنادی که فیلد مرتب سازی وجود دارد محدود می کند.برای ادغام
sum()
وaverage()
، مقادیر غیر عددی نادیده گرفته می شوند. انجمادهایsum()
وaverage()
فقط مقادیر عدد صحیح و مقادیر عدد ممیز شناور را در نظر می گیرند.هنگام ترکیب چند تجمع در یک کوئری، توجه داشته باشید که
sum()
وaverage()
مقادیر غیر عددی را نادیده می گیرند در حالی کهcount()
شامل مقادیر غیر عددی است.اگر مجموعههایی را که در فیلدهای مختلف هستند ترکیب کنید، محاسبه فقط شامل اسنادی میشود که همه آن فیلدها را شامل میشوند.
قیمت گذاری
قیمت گذاری برای پرس و جوهای انبوه به تعداد ورودی های فهرست مطابق با پرس و جو بستگی دارد. برای تعداد زیادی از ورودی های منطبق، تعداد کمی از خوانده ها از شما دریافت می شود.
اطلاعات دقیق تر قیمت را مشاهده کنید.