Nếu bạn cần trả lại một mẫu nhỏ tài liệu ngẫu nhiên từ một bộ sưu tập, đây là ba cách tiếp cận mà bạn có thể thử sử dụng đường dẫn tổng hợp.
$sample
Giai đoạn
$sample
giai đoạn đường ống tổng hợp được thiết kế đặc biệt để chọn ngẫu nhiên một số lượng tài liệu cụ thể.
Khi bạn sử dụng $sample
, bạn chỉ định số lượng tài liệu bạn muốn trả lại ở kích thước size
trường.
Giả sử chúng ta có bộ sưu tập sau được gọi là pets
:
{"_id":1, "name":"Wag", "type":"Dog", "weight":20} {"_id":2, "name":"Bark", "type" :"Dog", "weight":10} {"_id":3, "name":"Meo meo", "type":"Cat", "weight":7} {"_id":4, "name" :"Scratch", "type":"Cat", "weight":8} {"_id":5, "name":"Bruce", "type":"Bat", "weight":3} {" _id ":6," name ":" Hop "," type ":" Kangaroo "," weight ":130} {" _id ":7," name ":" Punch "," type ":" Gorilla ", "weight":300} {"_id":8, "name":"Snap", "type":"Crocodile", "weight":400} {"_id":9, "name":"Flutter", "type":"Hummingbird", "weight":1}
Chúng ta có thể sử dụng $sample
để lấy một mẫu ngẫu nhiên của những tài liệu như sau:
db.pets.aggregate ([{$ sample:{size:3}}])
Kết quả:
{"_id":1, "name":"Wag", "type":"Dog", "weight":20} {"_id":5, "name":"Bruce", "type" :"Bat", "weight":3} {"_id":3, "name":"Meo meo", "type":"Cat", "weight":7}
Trong trường hợp này, tôi đã chỉ định { size: 3 }
đã trả lại ba tài liệu.
Ở đây, nó lại sử dụng một kích thước mẫu khác:
db.pets.aggregate(
[
{
$sample: { size: 5 }
}
]
)
Kết quả:
{"_id":6, "name":"Hop", "type":"Kangaroo", "weight":130} {"_id":5, "name":"Bruce", "type" :"Bat", "weight":3} {"_id":8, "name":"Snap", "type":"Crocodile", "weight":400} {"_id":7, "name" :"Punch", "type":"Gorilla", "weight":300} {"_id":4, "name":"Scratch", "type":"Cat", "weight":8}
$sample
giai đoạn hoạt động theo một trong hai cách, tùy thuộc vào số lượng tài liệu có trong bộ sưu tập, kích thước mẫu liên quan đến số lượng tài liệu trong bộ sưu tập và vị trí của nó trong đường dẫn. Xem MongoDB$sample
để được giải thích về cách nó hoạt động.Cũng có thể là
$sample
giai đoạn có thể trả về cùng một tài liệu nhiều lần trong tập kết quả của nó.
$rand
Nhà điều hành
$rand
toán tử đã được giới thiệu trong MongoDB 4.4.2 và mục đích của nó là trả về một số thực ngẫu nhiên từ 0 đến 1 mỗi khi nó được gọi.Do đó, chúng ta có thể sử dụng nó trong
$match
giai đoạn kết hợp với các toán tử khác, chẳng hạn như$expr
và$lt
để trả lại một mẫu tài liệu ngẫu nhiên.Ví dụ:
db.pets.aggregate( [ { $match: { $expr: { $lt: [ 0.5, { $rand: {} } ] } } } ] )
Kết quả:
{"_id":3, "name":"Meo meo", "type":"Cat", "weight":7} {"_id":4, "name":"Scratch", "type" :"Cat", "weight":8} {"_id":6, "name":"Hop", "type":"Kangaroo", "weight":130} {"_id":9, "name" :"Flutter", "type":"Hummingbird", "weight":1}Tập kết quả từ phương pháp này khác với
$sample
cách tiếp cận, trong đó nó không trả về một số lượng tài liệu cố định. Số lượng tài liệu được trả về với cách tiếp cận này có thể khác nhau.Ví dụ:đây là điều sẽ xảy ra khi tôi chạy cùng một mã nhiều lần nữa.
Kết quả tập 2:
{"_id":1, "name":"Wag", "type":"Dog", "weight":20} {"_id":7, "name":"Punch", "type" :"Gorilla", "weight":300} {"_id":8, "name":"Snap", "type":"Crocodile", "weight":400}Kết quả tập 3:
{"_id":2, "name":"Bark", "type":"Dog", "weight":10} {"_id":4, "name":"Scratch", "type" :"Cat", "weight":8} {"_id":9, "name":"Flutter", "type":"Hummingbird", "weight":1}Kết quả tập 4:
{"_id":1, "name":"Wag", "type":"Dog", "weight":20} {"_id":3, "name":"Meo meo", "type" :"Cat", "weight":7} {"_id":6, "name":"Hop", "type":"Kangaroo", "weight":130} {"_id":8, "name" :"Snap", "type":"Crocodile", "weight":400}Kết quả tập 5:
{"_id":1, "name":"Wag", "type":"Dog", "weight":20} {"_id":4, "name":"Scratch", "type" :"Cat", "weight":8} {"_id":7, "name":"Punch", "type":"Gorilla", "weight":300} {"_id":8, "name" :"Snap", "type":"Crocodile", "weight":400} {"_id":9, "name":"Flutter", "type":"Hummingbird", "weight":1}
$sampleRate
Nhà điều hànhĐược giới thiệu trong MongoDB 4.4.2,
$sampleRate
toán tử cung cấp một cách ngắn gọn hơn để thực hiện giống như ví dụ trước.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ữa0
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ụ:
db.pets.aggregate( [ { $match: { $sampleRate: 0.5 } } ] )
Kết quả:
{"_id":1, "name":"Wag", "type":"Dog", "weight":20} {"_id":2, "name":"Bark", "type" :"Dog", "weight":10} {"_id":5, "name":"Bruce", "type":"Bat", "weight":3} {"_id":6, "name" :"Hop", "type":"Kangaroo", "weight":130} {"_id":7, "name":"Punch", "type":"Gorilla", "weight":300} {" _id ":8," name ":" Snap "," type ":" Crocodile "," weight ":400}Và chạy lại:
{"_id":3, "name":"Meo meo", "type":"Cat", "weight":7} {"_id":4, "name":"Scratch", "type" :"Cat", "weight":8} {"_id":7, "name":"Punch", "type":"Gorilla", "weight":300} {"_id":8, "name" :"Snap", "type":"Crocodile", "weight":400} {"_id":9, "name":"Flutter", "type":"Hummingbird", "weight":1}Và một lần nữa:
{"_id":1, "name":"Wag", "type":"Dog", "weight":20} {"_id":2, "name":"Bark", "type" :"Dog", "weight":10} {"_id":3, "name":"Meo meo", "type":"Cat", "weight":7} {"_id":8, "name" :"Snap", "type":"Crocodile", "weight":400}