Zapytanie agregujące przetwarza dane z wielu wpisów indeksu w celu zwrócenia pojedynczej wartości podsumowującej.
Cloud Firestore obsługuje zapytanie agregujące count()
. count()
pozwala określić liczbę dokumentów w kolekcji lub zapytaniu. Serwer oblicza liczbę i przesyła tylko wynik, pojedynczą liczbę całkowitą, z powrotem do aplikacji, oszczędzając zarówno na odczytach rozliczanych dokumentów, jak i przesłanych bajtach w porównaniu do wykonania pełnego zapytania.
Zapytania agregujące opierają się na istniejącej konfiguracji indeksu, z której już korzystają Twoje zapytania, i są skalowane proporcjonalnie do liczby przeskanowanych wpisów indeksu. Oznacza to, że agregacje małych i średnich zbiorów danych działają w ciągu 20–40 ms, chociaż opóźnienie wzrasta wraz z liczbą zliczonych elementów.
Użyj agregacji count()
Zapoznaj się z przykładowymi danymi, które skonfigurowaliśmy w Pobieranie danych .
Następująca agregacja count()
zwraca całkowitą liczbę miast w kolekcji cities
.
Web modular API
const coll = collection(db, "cities"); const snapshot = await getCountFromServer(coll); console.log('count: ', snapshot.data().count);
Szybki
let query = db.collection("cities") let countQuery = query.count do { let snapshot = try await countQuery.getAggregation(source: .server) print(snapshot.count) } catch { print(error) }
Cel 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"), );
Iść
Jawa
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);
Pyton
Agregacja count()
uwzględnia wszelkie filtry w zapytaniu i wszelkie klauzule 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);
Szybki
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) }
Cel 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"), );
Iść
Jawa
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);
Pyton
Reguły bezpieczeństwa Cloud Firestore działają tak samo w przypadku zapytań agregujących count()
jak w przypadku zwykłych zapytań zwracających dokumenty. Innymi słowy, wtedy i tylko wtedy, gdy reguły zezwalają klientom na wykonywanie określonych zapytań dotyczących kolekcji lub grup kolekcji, klienci mogą również wykonywać agregację count()
na tych zapytaniach. Dowiedz się więcej o tym , jak reguły bezpieczeństwa Cloud Firestore współdziałają z zapytaniami .
Ograniczenia
Należy zwrócić uwagę na następujące ograniczenia zapytania agregującego count()
:
zapytania agregujące
count()
są obecnie obsługiwane wyłącznie poprzez bezpośrednią odpowiedź serwera. Zapytania są obsługiwane tylko przez backend Cloud Firestore, z pominięciem lokalnej pamięci podręcznej i wszelkich buforowanych aktualizacji. To zachowanie jest identyczne z operacjami wykonywanymi w ramach transakcji Cloud Firestore . Obecnie nie można używać zapytańcount()
ze słuchaczami w czasie rzeczywistym i zapytaniami offline.Jeśli agregacja
count()
nie może zostać rozwiązana w ciągu 60 sekund, zwraca błądDEADLINE_EXCEEDED
. Wydajność zależy od konfiguracji indeksu i rozmiaru zestawu danych.Jeśli operacji nie można ukończyć w terminie 60 sekund, możliwym obejściem jest użycie liczników dla dużych zbiorów danych.
Agregacja
count()
odczytuje wpisy indeksu i zlicza tylko pola indeksowane.Dodanie klauzuli
OrderBy
do zapytania ogranicza liczbę do dokumentów, w których istnieje pole sortowania.
cennik
Cena funkcji count()
zależy od liczby wpisów indeksu pasujących do zapytania. Opłata jest pobierana za niewielką liczbę odczytów za dużą liczbę pasujących wpisów.
Zobacz bardziej szczegółowe informacje o cenach .