Kể từ MongoDB 3.4.9, một phần lý do cho sự thiên vị mà bạn đã quan sát là $sample
gần như hoàn toàn dựa vào việc triển khai con trỏ ngẫu nhiên của công cụ lưu trữ (xem SERVER-19183
). Điều này được thực hiện để $sample
có thể hoạt động tốt khi bộ sưu tập chứa nhiều dữ liệu. Tuy nhiên, vì công cụ lưu trữ lưu trữ các tài liệu theo thứ tự được sắp xếp bằng cách sử dụng triển khai kiểu B-tree, nên không phải lúc nào bạn cũng có thể tạo ra một kết quả thực sự ngẫu nhiên.
Hiện có hai yêu cầu tính năng cho $sample
tốt hơn cơ học, cụ thể là SERVER-22069
và SERVER-22068
.
Phải nói rằng, nếu bạn yêu cầu một mẫu dữ liệu thực sự không thiên vị, hãy sử dụng $sample
của riêng bạn -Giải pháp tương tự có thể là cách tốt nhất để tiến hành vào thời điểm này. Một cái gì đó như:
- Nhận danh sách tất cả
_id
trong bộ sưu tập. - Thực hiện lấy mẫu ngẫu nhiên trên danh sách này (ví dụ:sử dụng ngẫu nhiên của Python .choice ).
- Lấy tất cả các tài liệu có liên quan bằng cách sử dụng
_id
được lấy mẫu , sẽ có hiệu suất hợp lý tùy thuộc vào kích thước mẫu bạn muốn, vì_id
luôn được lập chỉ mục.