2017-10-03 19 views
5

Có thể đếm số lượng bộ sưu tập có sử dụng cơ sở dữ liệu firebase mới, firestore?Số bộ sưu tập pháo đài Firebase

Nếu có, tôi làm cách nào để quản lý?

+6

Bản sao có thể có của [Cách nhận số lượng tài liệu trong bộ sưu tập với Cloud Firestore] (https://stackoverflow.com/questions/46553314/how-to -get-a-count-of-number-of-tài liệu-trong-một-bộ sưu tập-với-đám mây-firestore) –

Trả lời

0

Theo như tôi biết không có giải pháp tích hợp cho điều này và nó chỉ có thể có trong sdk nút ngay bây giờ. Nếu bạn có một db.collection

('someCollection')

bạn có thể sử dụng

.Chọn ([ruộng])

để xác định những lĩnh vực mà bạn muốn chọn. Nếu bạn chọn một empty(), bạn sẽ chỉ nhận được một mảng tài liệu tham khảo.

dụ:

db.collection('someCollection').select().get().then( (snapshot) => console.log(snapshot.docs.length) );

Giải pháp này chỉ là một tối ưu hóa cho trường hợp xấu nhất của tải tất cả tài liệu và không quy mô trên bộ sưu tập lớn!

Cũng có một cái nhìn lúc này:
How to get a count of number of documents in a collection with Cloud Firestore

1

Không, không có built-in hỗ trợ cho các truy vấn tập hợp ngay bây giờ. Tuy nhiên có một vài điều bạn có thể làm.

Đầu tiên là documented here. Bạn có thể sử dụng giao dịch hoặc chức năng đám mây để duy trì thông tin tổng hợp:

Ví dụ này cho thấy cách sử dụng hàm để theo dõi số lượng xếp hạng trong phần con, cũng như xếp hạng trung bình.

exports.aggregateRatings = firestore 
    .document('restaurants/{restId}/ratings/{ratingId}') 
    .onWrite(event => { 
    // Get value of the newly added rating 
    var ratingVal = event.data.get('rating'); 

    // Get a reference to the restaurant 
    var restRef = db.collection('restaurants').document(event.params.restId); 

    // Update aggregations in a transaction 
    return db.transaction(transaction => { 
     return transaction.get(restRef).then(restDoc => { 
     // Compute new number of ratings 
     var newNumRatings = restDoc.data('numRatings') + 1; 

     // Compute new average rating 
     var oldRatingTotal = restDoc.data('avgRating') * restDoc.data('numRatings'); 
     var newAvgRating = (oldRatingTotal + ratingVal)/newNumRatings; 

     // Update restaurant info 
     return transaction.update(restRef, { 
      avgRating: newAvgRating, 
      numRatings: newNumRatings 
     }); 
     }); 
    }); 
}); 

Giải pháp mà jbb đề cập cũng hữu ích nếu bạn chỉ muốn đếm tài liệu không thường xuyên. Đảm bảo sử dụng câu lệnh select() để tránh tải xuống tất cả tài liệu (rất nhiều băng thông khi bạn chỉ cần đếm). select() hiện chỉ có sẵn trong SDK máy chủ để giải pháp không hoạt động trong ứng dụng dành cho thiết bị di động.

3

Cách đơn giản nhất để làm như vậy là đọc kích thước của "querySnapshot".

db.collection("cities").get().then(function(querySnapshot) {  
    console.log(querySnapshot.size); 
}); 

Bạn cũng có thể đọc độ dài của mảng tài liệu bên trong "querySnapshot".

querySnapshot.docs.length; 

Hoặc nếu một "querySnapshot" trống bằng cách đọc giá trị trống, giá trị này sẽ trả về giá trị boolean.

querySnapshot.empty; 
+3

Hãy nhận biết rằng mỗi tài liệu "chi phí" một đọc.Vì vậy, nếu bạn đếm 100 mặt hàng trong một bộ sưu tập theo cách này, bạn sẽ bị tính phí cho 100 lần đọc! – Georg

+0

Đúng, nhưng không có cách nào khác để tổng hợp số lượng tài liệu trong bộ sưu tập. Và nếu bạn đã tìm nạp bộ sưu tập, việc đọc mảng "tài liệu" sẽ không yêu cầu tìm nạp thêm, do đó sẽ không có thêm chi phí "đọc". – Ompel

+0

Điều này đọc tất cả các tài liệu trong bộ nhớ! Chúc may mắn với điều đó cho các tập dữ liệu lớn ... –