שאילתת צבירה מעבדת את הנתונים מכניסות אינדקס מרובות כדי להחזיר ערך סיכום יחיד.
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 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
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);
מָהִיר
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
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()
תלוי במספר כניסות האינדקס המותאמות על ידי השאילתה. אתה מחויב במספר קטן של קריאות עבור מספר רב של ערכים תואמים.
ראה מידע תמחור מפורט יותר.