Truy vấn tổng hợp xử lý dữ liệu từ nhiều mục nhập chỉ mục để trả về một giá trị tóm tắt duy nhất.
Cloud Firestore hỗ trợ truy vấn tổng hợp count()
. count()
cho phép bạn xác định số lượng tài liệu trong một bộ sưu tập hoặc truy vấn. Máy chủ tính toán số lượng và chỉ truyền kết quả, một số nguyên duy nhất, trở lại ứng dụng của bạn, tiết kiệm cả số lần đọc tài liệu được tính phí và số byte được truyền, so với việc thực hiện toàn bộ truy vấn.
Truy vấn tổng hợp dựa trên cấu hình chỉ mục hiện có mà truy vấn của bạn đã sử dụng và chia tỷ lệ tương ứng với số mục nhập chỉ mục được quét. Điều này có nghĩa là việc tổng hợp các tập dữ liệu có kích thước vừa và nhỏ sẽ thực hiện trong vòng 20-40 mili giây, mặc dù độ trễ tăng theo số lượng mục được đếm.
Sử dụng tổng hợp count()
Tham khảo dữ liệu mẫu chúng ta thiết lập ở phần Lấy dữ liệu .
Tổng hợp count()
sau đây trả về tổng số thành phố trong bộ sưu tập cities
.
Web modular API
const coll = collection(db, "cities"); const snapshot = await getCountFromServer(coll); console.log('count: ', snapshot.data().count);
Nhanh
let query = db.collection("cities") let countQuery = query.count do { let snapshot = try await countQuery.getAggregation(source: .server) print(snapshot.count) } catch { print(error) }
Mục tiêu-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
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);
Python
Tập hợp count()
tính đến mọi bộ lọc trên truy vấn và mọi mệnh đề 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);
Nhanh
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) }
Mục tiêu-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
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);
Python
Quy tắc bảo mật của Cloud Firestore hoạt động tương tự trên các truy vấn tổng hợp count()
như trên các truy vấn thông thường trả về tài liệu. Nói cách khác, nếu và chỉ nếu quy tắc của bạn cho phép khách hàng thực hiện một số truy vấn bộ sưu tập hoặc nhóm bộ sưu tập nhất định, thì khách hàng cũng có thể thực hiện tổng hợp count()
trên các truy vấn đó. Tìm hiểu thêm về cách Quy tắc bảo mật của Cloud Firestore tương tác với truy vấn .
Hạn chế
Lưu ý các hạn chế sau đối với truy vấn tổng hợp count()
:
truy vấn tổng hợp
count()
hiện chỉ được hỗ trợ thông qua phản hồi trực tiếp của máy chủ. Các truy vấn chỉ được phục vụ bởi chương trình phụ trợ của Cloud Firestore, bỏ qua bộ nhớ đệm cục bộ và mọi bản cập nhật được lưu vào bộ đệm. Hành vi này giống hệt với các hoạt động được thực hiện bên trong các giao dịch Cloud Firestore . Hiện tại bạn không thể sử dụng truy vấncount()
với trình nghe thời gian thực và truy vấn ngoại tuyến.Nếu tập hợp
count()
không thể giải quyết trong vòng 60 giây, nó sẽ trả về lỗiDEADLINE_EXCEEDED
. Hiệu suất phụ thuộc vào cấu hình chỉ mục của bạn và kích thước của tập dữ liệu.Nếu thao tác không thể hoàn thành trong thời hạn 60 giây, giải pháp khả thi là sử dụng bộ đếm cho các tập dữ liệu lớn.
Tập hợp
count()
đọc từ các mục chỉ mục và chỉ đếm các trường được lập chỉ mục.Việc thêm mệnh đề
OrderBy
vào truy vấn sẽ giới hạn số lượng tài liệu có trường sắp xếp tồn tại.
Định giá
Giá cho count()
phụ thuộc vào số lượng mục nhập chỉ mục phù hợp với truy vấn. Bạn bị tính phí một số lần đọc nhỏ cho một số lượng lớn các mục nhập trùng khớp.
Xem thêm thông tin giá cả chi tiết.