2017-10-03 30 views
13

Trong Firestore, làm cách nào tôi có thể nhận tổng số tài liệu trong bộ sưu tập?Cách nhận số lượng tài liệu trong bộ sưu tập với Cloud Firestore

Ví dụ nếu tôi có

/people 
    /123456 
     /name - 'John' 
    /456789 
     /name - 'Jane' 

tôi muốn truy vấn có bao nhiêu người tôi có và nhận được 2.

tôi có thể làm một truy vấn trên/người và sau đó nhận được chiều dài của kết quả trả về , nhưng điều đó có vẻ là một sự lãng phí, đặc biệt là vì tôi sẽ làm điều này trên các tập dữ liệu lớn hơn.

Trả lời

20

Bạn hiện có 3 lựa chọn:

Lựa chọn 1: Khách hàng bên

này về cơ bản là phương pháp mà bạn đề cập. Chọn tất cả từ bộ sưu tập và đếm ở phía khách hàng. Điều này hoạt động tốt đủ cho các tập dữ liệu nhỏ nhưng rõ ràng là không hoạt động nếu tập dữ liệu lớn hơn.

Phương án 2: Viết thời gian nhất nỗ lực

Với phương pháp này, bạn có thể sử dụng đám mây Chức năng để cập nhật một bộ đếm cho mỗi lần thêm và xóa từ bộ sưu tập.

Điều này phù hợp với bất kỳ kích thước tập dữ liệu nào, miễn là bổ sung/xóa chỉ xảy ra với tốc độ nhỏ hơn hoặc bằng 1 mỗi giây. Điều này cung cấp cho bạn một tài liệu để đọc để cung cấp cho bạn số lượng gần như hiện tại ngay lập tức.

Nếu cần vượt quá 1 mỗi giây, bạn cần triển khai distributed counters per our documentation.

Lựa chọn 3: Viết thời gian chính xác

Thay vì sử dụng đám mây Chức năng, trong ứng dụng của bạn, bạn có thể cập nhật bộ đếm cùng một lúc khi bạn thêm hoặc xóa một tài liệu. Điều này có nghĩa là bộ đếm cũng sẽ là hiện tại, nhưng bạn sẽ cần đảm bảo bao gồm logic này ở bất cứ nơi nào bạn thêm hoặc xóa tài liệu.

Giống như phương án 2, bạn sẽ cần phải thực hiện phân phối quầy nếu bạn muốn vượt qua mỗi giây

+1

Chỉ cần tự hỏi, có khả năng là những cách khác để thực hiện việc này trong tương lai không? Một cái gì đó đơn giản như hàm tổng hợp SQL COUNT sẽ hoạt động trên các tập dữ liệu lớn trong khi vẫn duy trì hiệu năng tốt? – saricden

+0

@saricden COUNT tổng hợp thực tế có rất nhiều vấn đề về hiệu suất tiềm năng.Hệ thống Cloud Firestore được thiết kế cho các hoạt động giữ cho các đặc tính hiệu suất giống nhau bất kể kích thước tập dữ liệu, mà COUNT không. Chúng tôi đang tìm kiếm các tùy chọn trong tương lai để đạt được sự cân bằng. –

0

Sau Dan trả lời: Bạn có thể có một bộ đếm tách ra trong cơ sở dữ liệu của bạn và sử dụng đám mây Chức năng để duy trì nó. (Viết thời gian nhất nỗ lực)

// Example of performing an increment when item is added 
module.exports.incrementIncomesCounter = collectionRef.onCreate(event => { 
    const counterRef = event.data.ref.firestore.doc('counters/incomes') 

    counterRef.get() 
    .then(documentSnapshot => { 
    const currentCount = documentSnapshot.exists ? documentSnapshot.data().count : 0 

    counterRef.set({ 
     count: Number(currentCount) + 1 
    }) 
    .then(() => { 
     console.log('counter has increased!') 
    }) 
    }) 
}) 

Mã này cho bạn thấy những ví dụ hoàn chỉnh về cách để làm điều đó: https://gist.github.com/saintplay/3f965e0aea933a1129cc2c9a823e74d7

0

Nếu bạn sử dụng AngulareFire2, bạn có thể làm (giả sử private afs: AngularFirestore được tiêm trong người xây dựng của bạn):

this.afs.collection(myCollection).valueChanges().subscribe(values => console.log(values.length)); Ở đây, values là một mảng của tất cả các mục trong myCollection. Bạn không cần siêu dữ liệu để có thể sử dụng trực tiếp phương thức valueChanges().

+0

Điều gì xảy ra nếu bộ sưu tập chứa hàng triệu tài liệu? –

Các vấn đề liên quan