Firebase is back at Google I/O on May 10! Register now

ספירת מסמכים עם שאילתות צבירה

קל לארגן דפים בעזרת אוספים אפשר לשמור ולסווג תוכן על סמך ההעדפות שלך.

שאילתת צבירה מעבדת את הנתונים מכניסות אינדקס מרובות כדי להחזיר ערך סיכום יחיד.

Cloud Firestore תומך בשאילתת הצבירה count() . count() מאפשר לך לקבוע את מספר המסמכים באוסף או שאילתה. השרת מחשב את הספירה, ומשדר רק את התוצאה, מספר שלם בודד, בחזרה לאפליקציה שלך, תוך חיסכון בקריאה של מסמכים מחויבים ובייטים שהועברו, בהשוואה לביצוע השאילתה המלאה.

שאילתות צבירה מסתמכות על תצורת האינדקס הקיימת שבה השאילתות שלך כבר משתמשות, ומתארכות באופן יחסי למספר ערכי האינדקס שנסרקו. המשמעות היא שצבירות של ערכות נתונים קטנות עד בינוניות פועלות בתוך 20-40 אלפיות השנייה, אם כי זמן האחזור גדל עם מספר הפריטים שנספרו.

השתמש בצבירה count()

עיין בנתונים לדוגמה שהגדרנו בקבלת נתונים .

צבירת ה- count() הבאה מחזירה את המספר הכולל של הערים באוסף cities .

Web version 9

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);
}
Objective-C
הערה: מוצר זה אינו זמין ביעדי 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())
    }
}

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());
  }
});
      
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);
      

צבירה count() לוקחת בחשבון מסננים כלשהם בשאילתה וכל סעיפי limit . לדוגמה, הצבירה הבאה מחזירה ספירה של מספר הערים שבהן state שווה CA .

Web version 9

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);
}
Objective-C
הערה: מוצר זה אינו זמין ביעדי 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())
    }
}

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());
  }
});
      
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);
      

כללי האבטחה של Cloud Firestore פועלים באופן זהה בשאילתות צבירה count() כמו בשאילתות רגילות המחזירות מסמכים. במילים אחרות, אם ורק אם הכללים שלך מאפשרים ללקוחות לבצע שאילתות מסוימות של איסוף או קבוצת איסוף, לקוחות יכולים גם לבצע את צבירה count() בשאילתות אלו. למידע נוסף על האופן שבו כללי האבטחה של Cloud Firestore מתקשרים עם שאילתות .

מגבלות

שים לב למגבלות הבאות על שאילתת הצבירה count() :

  • שאילתות צבירה count() נתמכות כרגע רק באמצעות תגובת שרת ישירה. שאילתות מוגשות רק על ידי ה-Cloud Firestore, תוך דילוג על המטמון המקומי וכל העדכונים המאוחסנים. התנהגות זו זהה לפעולות המבוצעות בתוך עסקאות Cloud Firestore . אינך יכול להשתמש כעת בשאילתות count() עם מאזינים בזמן אמת ושאילתות לא מקוונות.

  • אם צבירה count() אינה יכולה להיפתר תוך 60 שניות, היא מחזירה שגיאה DEADLINE_EXCEEDED . הביצועים תלויים בתצורת האינדקס שלך ובגודל מערך הנתונים.

    אם לא ניתן להשלים את הפעולה בתוך המועד האחרון של 60 שניות, פתרון אפשרי הוא להשתמש במונים עבור מערכי נתונים גדולים.

  • צבירת ה- count() קוראת מתוך ערכי אינדקס וסופרת רק שדות שצורפו לאינדקס.

  • הוספת סעיף OrderBy לשאילתה מגבילה את הספירה לישויות שבהן קיים מאפיין המיון.

תמחור

תמחור עבור count() תלוי במספר כניסות האינדקס המותאמות על ידי השאילתה. אתה מחויב במספר קטן של קריאות עבור מספר רב של ערכים תואמים.

ראה מידע תמחור מפורט יותר.