Catch up on highlights from Firebase at Google I/O 2023. Learn more

عد المستندات مع استعلامات التجميع

يعالج استعلام التجميع البيانات من إدخالات فهرس متعددة لإرجاع قيمة تلخيصية واحدة.

يدعم Cloud Firestore استعلام تجميع count() . يسمح لك count() بتحديد عدد المستندات في مجموعة أو استعلام. يحسب الخادم العدد ، ويرسل النتيجة فقط ، وهو عدد صحيح واحد ، مرة أخرى إلى تطبيقك ، مما يوفر في كل من قراءات المستندات المفوترة والبايتات المنقولة ، مقارنةً بتنفيذ الاستعلام الكامل.

تعتمد استعلامات التجميع على تكوين الفهرس الحالي الذي تستخدمه استعلاماتك بالفعل ، وتتناسب مع عدد إدخالات الفهرس التي تم فحصها. هذا يعني أن تجميعات مجموعات البيانات الصغيرة إلى المتوسطة الحجم تعمل في غضون 20-40 مللي ثانية ، على الرغم من زيادة زمن الانتقال مع عدد العناصر التي تم احتسابها.

استخدم التجميع count()

الرجوع إلى البيانات النموذجية التي قمنا بإعدادها في الحصول على البيانات .

يُرجع التجميع التالي count() إجمالي عدد المدن في مجموعة cities .

Web modular API

const coll = collection(db, "cities");
const snapshot = await getCountFromServer(coll);
console.log('count: ', snapshot.data().count);
سويفت
ملاحظة: هذا المنتج غير متوفر في أهداف watchOS و App Clip.
let query = db.collection("cities")
let countQuery = query.count
do {
    let snapshot = try await countQuery.getAggregation(source: .server)
    print(snapshot.count)
} catch {
    print(error);
}
ج موضوعية
ملاحظة: هذا المنتج غير متوفر في أهداف watchOS و App Clip.
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 . على سبيل المثال ، يُرجع التجميع التالي عدد المدن التي تساوي فيها state CA

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);
سويفت
ملاحظة: هذا المنتج غير متوفر في أهداف watchOS و App Clip.
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);
}
ج موضوعية
ملاحظة: هذا المنتج غير متوفر في أهداف watchOS و App Clip.
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);
      

تعمل قواعد أمان Cloud Firestore بنفس الطريقة على استعلامات تجميع count() كما في الاستعلامات العادية التي تُرجع المستندات. بعبارة أخرى ، إذا وفقط إذا كانت القواعد الخاصة بك تسمح للعملاء بتنفيذ مجموعة معينة أو استعلامات مجموعة التحصيل ، فيمكن للعملاء أيضًا إجراء تجميع count() على تلك الاستعلامات. تعرف على المزيد حول كيفية تفاعل قواعد أمان Cloud Firestore مع الاستعلامات .

محددات

لاحظ القيود التالية على استعلام التجميع count() :

  • لا يتم دعم استعلامات التجميع count() حاليًا إلا عبر استجابة الخادم المباشرة. يتم تقديم الاستعلامات فقط من خلال الواجهة الخلفية Cloud Firestore ، مع تخطي ذاكرة التخزين المؤقت المحلية وأي تحديثات مخزنة. هذا السلوك مماثل للعمليات التي يتم إجراؤها داخل معاملات Cloud Firestore . لا يمكنك حاليًا استخدام استعلامات count() مع المستمعين في الوقت الفعلي والاستعلامات غير المتصلة بالإنترنت.

  • إذا تعذر حل التجميع count() في غضون 60 ثانية ، فسيتم إرجاع خطأ DEADLINE_EXCEEDED . يعتمد الأداء على تكوين الفهرس الخاص بك وعلى حجم مجموعة البيانات.

    إذا تعذر إكمال العملية خلال مهلة 60 ثانية ، فإن الحل البديل المحتمل هو استخدام عدادات لمجموعات البيانات الكبيرة.

  • يقرأ count() التجميع من مدخلات الفهرس ويحسب الحقول المفهرسة فقط.

  • تؤدي إضافة بند OrderBy إلى الاستعلام إلى الحد من عدد المستندات التي يوجد بها حقل الفرز.

التسعير

يعتمد تسعير count() على عدد إدخالات الفهرس المطابقة للاستعلام. يتم محاسبتك على عدد قليل من القراءات لعدد كبير من الإدخالات المتطابقة.

اطلع على معلومات التسعير الأكثر تفصيلاً.