Trong MongoDB, $sampleRate
giai đoạn đường ống tổng hợp khớp với một lựa chọn ngẫu nhiên của các tài liệu đầu vào.
Số lượng tài liệu được chọn xấp xỉ với tỷ lệ mẫu được biểu thị bằng phần trăm của tổng số tài liệu.
$sampleRate
toán tử đã được giới thiệu trong MongoDB 4.4.2.
Khi bạn sử dụng $sampleRate
, bạn cung cấp tỷ lệ mẫu dưới dạng số dấu phẩy động giữa 0
và 1
. Quy trình lựa chọn sử dụng phân phối ngẫu nhiên đồng nhất và tỷ lệ mẫu bạn cung cấp thể hiện xác suất một tài liệu nhất định sẽ được chọn khi nó đi qua đường ống.
Ví dụ
Giả sử chúng ta có một bộ sưu tập được gọi là employees
với các tài liệu sau:
{ "_id" : 1, "name" : "Bob", "salary" : 55000 } { "_id" : 2, "name" : "Sarah", "salary" : 128000 } { "_id" : 3, "name" : "Fritz", "salary" : 25000 } { "_id" : 4, "name" : "Christopher", "salary" : 45000 } { "_id" : 5, "name" : "Beck", "salary" : 82000 } { "_id" : 6, "name" : "Homer", "salary" : 1 } { "_id" : 7, "name" : "Bartholomew", "salary" : 1582000 } { "_id" : 8, "name" : "Zoro", "salary" : 300000 } { "_id" : 9, "name" : "Xena", "salary" : 382000 }
Chúng ta có thể sử dụng $sample
để chọn ngẫu nhiên một số lượng tài liệu cụ thể từ bộ sưu tập đó.
Ví dụ:
db.employees.aggregate(
[
{
$match: { $sampleRate: 0.33 }
}
]
)
Kết quả:
{ "_id" : 1, "name" : "Bob", "salary" : 55000 } { "_id" : 6, "name" : "Homer", "salary" : 1 } { "_id" : 8, "name" : "Zoro", "salary" : 300000 }
Bằng cách cung cấp tỷ lệ mẫu 0.33
, chúng tôi chỉ định rằng khoảng một phần ba tài liệu sẽ được trả lại.
Tuy nhiên, kết quả thực tế có thể khác nhau khá nhiều, tùy thuộc vào số lượng tài liệu có trong bộ sưu tập. Các bộ sưu tập có số lượng tài liệu ít hơn sẽ có kết quả khá đa dạng, trong khi các bộ sưu tập lớn hơn sẽ gần với phân phối ngẫu nhiên đồng nhất như mong đợi.
Để chứng minh điều này, đây là tập hợp kết quả tôi nhận được khi chạy lại cùng một mã:
{ "_id" : 2, "name" : "Sarah", "salary" : 128000 } { "_id" : 3, "name" : "Fritz", "salary" : 25000 } { "_id" : 4, "name" : "Christopher", "salary" : 45000 } { "_id" : 5, "name" : "Beck", "salary" : 82000 } { "_id" : 6, "name" : "Homer", "salary" : 1 } { "_id" : 7, "name" : "Bartholomew", "salary" : 1582000 }
Và một lần nữa:
{ "_id" : 7, "name" : "Bartholomew", "salary" : 1582000 } { "_id" : 8, "name" : "Zoro", "salary" : 300000 }
Và một lần nữa:
{ "_id" : 3, "name" : "Fritz", "salary" : 25000 } { "_id" : 6, "name" : "Homer", "salary" : 1 } { "_id" : 7, "name" : "Bartholomew", "salary" : 1582000 }
Đây là một bộ sưu tập nhỏ hơn, và do đó, kết quả thay đổi khá nhiều.
Nếu bạn yêu cầu trả lại số lượng tài liệu chính xác, hãy sử dụng $sample
sân khấu thay thế.