Trong MongoDB, $rand
toán tử đường ống tổng hợp trả về một số thực ngẫu nhiên từ 0 đến 1.
Giá trị dấu phẩy động có tối đa 17 chữ số sau dấu thập phân. Mọi số 0 ở cuối đều bị bỏ đi, vì vậy số lượng chữ số có thể thay đổi.
$rand
toán tử đã được giới thiệu trong MongoDB 4.4.2.
Ví dụ
Giả sử chúng ta có một bộ sưu tập có tên là cats
với các tài liệu sau:
{"_id":1, "name":"Scratch"} {"_id":2, "name":"Meow"} {"_id":3, "name":"Fluffy"}Chúng ta có thể sử dụng
$rand
toán tử để tạo một số ngẫu nhiên cho mỗi con mèo:db.cats.aggregate( [ { $project: { randomNumber: { $rand: {} } } } ] )
Kết quả:
{"_id":1, "randomNumber":0,5593964875463812} {"_id":2, "randomNumber":0,04357301703691149} {"_id":3, "randomNumber":0,7556877215199272}
$rand
toán tử không chấp nhận bất kỳ đối số nào - bạn chỉ cần gọi nó bằng cách sử dụng$rand: {}
.Ngoài ra,
$rand
tạo ra một số mới mỗi khi nó được gọi. Do đó, chạy mã trên nhiều lần sẽ tạo ra một số ngẫu nhiên khác nhau cho mỗi con mèo.Để chứng minh điều này, tôi sẽ chạy lại và đây là kết quả mới:
{"_id":1, "randomNumber":0,19672627212049873} {"_id":2, "randomNumber":0,05513133909795318} {"_id":3, "randomNumber":0,7509841462815067}Chúng ta có thể thấy rằng các số ngẫu nhiên khác với các số được tạo trong ví dụ trước.
Số Ngẫu nhiên Lớn hơn 1
Như đã đề cập,
$rand
trả về một số thực ngẫu nhiên từ 0 đến 1. Điều này là tốt nếu chúng ta không ngại nhận một số 0, theo sau là tối đa 17 chữ số thập phân ngẫu nhiên.Nhưng nếu chúng ta muốn một số ngẫu nhiên lớn hơn 1 thì sao?
Trong những trường hợp như vậy, chúng ta có thể sử dụng
$multiply
toán tử để nhân kết quả của$rand
.Ví dụ:
db.cats.aggregate( [ { $project: { randomNumber: { $multiply: [ { $rand: {} }, 10 ] } } } ] )
Kết quả:
{"_id":1, "randomNumber":1.958938543288535} {"_id":2, "randomNumber":4.437057321655847} {"_id":3, "randomNumber":8.238909118372334}Số nguyên Ngẫu nhiên
Chúng tôi cũng có thể muốn loại bỏ phần phân số. Trong trường hợp này, chúng ta có thể sử dụng toán tử như
$floor
để xóa phần thập phân, do đó để lại một số nguyên.Ví dụ:
db.cats.aggregate( [ { $project: { name: 1, randomNumber: { $floor: { $multiply: [ { $rand: {} }, 10 ] } } } } ] )
Kết quả:
{"_id":1, "name":"Scratch", "randomNumber":0} {"_id":2, "name":"Meo meo", "randomNumber":5} {"_id":3, "name":"Fluffy", "randomNumber":7}Đây là một lần nữa, nhưng lần này chúng tôi nhân nó với 100:
db.cats.aggregate( [ { $project: { name: 1, randomNumber: { $floor: { $multiply: [ { $rand: {} }, 100 ] } } } } ] )
Kết quả:
{"_id":1, "name":"Scratch", "randomNumber":18} {"_id":2, "name":"Meo meo", "randomNumber":62} {"_id":3, "name":"Fluffy", "randomNumber":92}Lưu kết quả
Như đã đề cập,
$rand
tạo một float ngẫu nhiên mới mỗi khi nó được gọi. Điều này là tốt nếu chúng ta muốn có một số ngẫu nhiên mới mỗi khi chúng ta chạy mã, nhưng nếu chúng ta muốn lưu trữ số ngẫu nhiên trong mỗi tài liệu thì sao?Để lưu trữ số ngẫu nhiên trong tài liệu, chúng ta có thể sử dụng
$addFields
toán tử (hoặc bí danh của nó$set
) để thêm trường mới vào tài liệu.Ví dụ:
db.cats.aggregate( [ { $set: { randomNumber: { $multiply: [ { $rand: {} }, 100 ] } } }, { $set: { randomNumber: { $floor: "$randomNumber" } } }, { $merge: "cats" } ] )
Trong ví dụ này, chúng tôi phân tách hoạt động trên hai
$set
các giai đoạn và một$merge
sân khấu.
$merge
giai đoạn ghi kết quả của đường ống tổng hợp vào một tập hợp cụ thể và nó phải là giai đoạn cuối cùng trong đường dẫn.Bây giờ khi chúng tôi trả lại các tài liệu từ bộ sưu tập đó (ví dụ:bằng cách sử dụng một phương thức như
find()
), chúng ta có thể thấy rằng mỗi tài liệu chứa trường mới với số ngẫu nhiên:db.cats.find()
Kết quả:
{"_id":1, "name":"Scratch", "randomNumber":61} {"_id":2, "name":"Meo meo", "randomNumber":86} {"_id":3, "name":"Fluffy", "randomNumber":73}Bây giờ số ngẫu nhiên là liên tục. Chúng tôi có thể trả lại tài liệu bao nhiêu lần tùy thích và số ngẫu nhiên sẽ được giữ nguyên.
Hãy chạy
find()
một lần nữa:db.cats.find()
Kết quả:
{"_id":1, "name":"Scratch", "randomNumber":61} {"_id":2, "name":"Meo meo", "randomNumber":86} {"_id":3, "name":"Fluffy", "randomNumber":73}Chính xác là cùng một số ngẫu nhiên.