Lá cờ thưa thớt hơi kì cục. Để hiểu khi nào sử dụng nó, bạn phải hiểu tại sao "thưa thớt" lại tồn tại ngay từ đầu.
Khi bạn tạo một chỉ mục đơn giản trên một trường, sẽ có một mục nhập cho mỗi tài liệu, ngay cả những tài liệu không có trường đó.
Ví dụ:nếu bạn có chỉ mục trên {rarely_set_field : 1}
, bạn sẽ có một chỉ mục được điền gần hết bằng null
bởi vì trường đó không tồn tại trong hầu hết các trường hợp. Điều này gây lãng phí dung lượng và tìm kiếm không hiệu quả.
{sparse:true}
tùy chọn sẽ loại bỏ null
giá trị, vì vậy bạn sẽ nhận được một chỉ mục chỉ chứa các mục nhập khi {rarely_set_field}
được xác định.
Quay lại trường hợp của bạn.
Bạn đang hỏi về việc sử dụng boolean + thưa. Nhưng thưa thớt không thực sự ảnh hưởng đến "boolean", thưa thớt ảnh hưởng "được đặt so với không được đặt".
Trong trường hợp của bạn, bạn đang cố gắng tìm nạp unfinished
. Để tận dụng sparse
khóa không phải là giá trị boolean, mà là thực tế là unfinished
các mục nhập có khóa đó và các mục nhập "đã hoàn thành" không có khóa nào cả.
{ _id: 1, data: {...}, unfinished: true }
{ _id: 2, data: {...} } // this entry is finished
Có vẻ như bạn đang sử dụng Hàng đợi
Bạn chắc chắn có thể tận dụng thông tin ở trên để triển khai một chỉ mục thưa thớt. Tuy nhiên, nó thực sự có vẻ như bạn đang sử dụng Hàng đợi. MongoDB có thể phục vụ dưới dạng Hàng đợi, đây là hai ví dụ .
Tuy nhiên, nếu bạn nhìn vào Hàng đợi, họ không làm theo cách bạn đang làm. Cá nhân tôi đang sử dụng MongoDB làm Hàng đợi cho một số hệ thống sản xuất và nó chạy khá tốt, nhưng hãy kiểm tra tải dự kiến của bạn như một Hàng đợi chuyên dụng sẽ hoạt động tốt hơn nhiều.