Catch up on everything announced at Firebase Summit, and learn how Firebase can help you accelerate app development and run your app with confidence. Learn More

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

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

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

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);
    
מָהִיר
let collection = db.collection("cities")
let countQuery = collection.count
do {
  let snapshot = try await countQuery.getAggregation(source: .server)
  print(snapshot.count)
} catch {
  print(error);
}
      
Objective-C
FIRCollectionReference* collection = [db collectionWithPath:@"cities"];
[collection.count
  aggregationWithSource:FIRAggregateSourceServer
  completion:^(FIRAggregateQuerySnapshot *snapshot, NSError *error) {
    if (error == nil) {
        NSLog(@"Cities count: %@", snapshot.count);
    } else {
        NSLog(@"Error fetching count: %@", error);
    }
  }
];
      

Kotlin+KTX

val collection = db.collection("cities")
val countQuery = collection.count()
countQuery.get(AggregateSource.SERVER).addOnCompleteListener { task ->
  if (task.isSuccessful) {
    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 query_ = query(coll, where('state', '==', 'CA'));
const snapshot = await getCountFromServer(query_);
console.log('count: ', snapshot.data().count);
    
מָהִיר
let collection = db.collection("cities")
let query = collection.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
FIRCollectionReference* collection = [db collectionWithPath:@"cities"];
FIRQuery* query = [collection queryWhereField:@"state" isEqualTo:@"CA"];
[query.count
  aggregationWithSource:FIRAggregateSourceServer
  completion:^(FIRAggregateQuerySnapshot *snapshot, NSError *error) {
    if (error == nil) {
        NSLog(@"Cities count: %@", snapshot.count);
    } else {
        NSLog(@"Error fetching count: %@", error);
    }
  }
];
      

Kotlin+KTX

val collection = db.collection("cities")
val query = collection.whereEqualTo("state", "CA")
val countQuery = query.count()
countQuery.get(AggregateSource.SERVER).addOnCompleteListener { task ->
  if (task.isSuccessful) {
    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() תלוי במספר כניסות האינדקס המותאמות על ידי השאילתה. אתה מחויב במספר קטן של קריאות עבור מספר רב של ערכים תואמים.

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