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

Đếm tài liệu với các truy vấn tổng hợp

Sử dụng bộ sưu tập để sắp xếp ngăn nắp các trang Lưu và phân loại nội dung dựa trên lựa chọn ưu tiên của bạn.

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 vừa và 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 version 9

const coll = collection(db, "cities");
const snapshot = await getCountFromServer(coll);
console.log('count: ', snapshot.data().count);
    
Nhanh
let collection = db.collection("cities")
let countQuery = collection.count
do {
  let snapshot = try await countQuery.getAggregation(source: .server)
  print(snapshot.count)
} catch {
  print(error);
}
      
Mục tiêu-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);
      

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 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);
    
Nhanh
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);
}
      
Mục tiêu-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);
      

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ấn count() 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ỗi DEADLINE_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 đối với các thực thể có thuộc tính 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ả .