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 lập hóa đơn 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ệ theo số lượng 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 nhỏ đến trung bình 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ập hợp count()
Tham khảo dữ liệu ví dụ mà chúng tôi thiết lập trong Lấy dữ liệu .
Tập 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"), );
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);
Tập hợp count()
tính đến bất kỳ bộ lọc nào trong truy vấn và bất kỳ mệnh đề limit
nào. Ví dụ: tổng hợp sau đây trả về số lượng thành phố nơi state
bằng CA
.
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"), );
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);
Quy tắc bảo mật của Cloud Firestore hoạt động tương tự đối với các truy vấn tổng hợp count()
cũng như đối với 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ỉ khi các quy tắc của bạn cho phép máy khách 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ì máy khách cũng có thể thực hiện phép cộng 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 giới hạn 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 phụ trợ Cloud Firestore, bỏ qua bộ đệm cục bộ và mọi 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 giao dịch Cloud Firestore . Bạn hiệ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, một giải pháp thay thế 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 nhập 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.
đị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 phù hợp.
Xem thêm thông tin chi tiết về giá cả .