Ý tưởng đằng sau việc lấy một bản ghi ngẫu nhiên là truy vấn tất cả các bản ghi phù hợp nhưng chỉ lấy một bản ghi. Đây là những gì findOne()
không có bất kỳ tiêu chí nào được đưa ra.
Sau đó, bạn sẽ muốn chọn một mục nhập ngẫu nhiên trong tất cả các trận đấu có thể. Điều này được thực hiện bởi:
-
Tìm xem có thể có bao nhiêu mục nhập - chúng tôi sử dụng
count()
trên bộ sưu tập cho điều này. Lưu ý rằng, như đã đề cập trong nhận xét,count
không được dùng nữa trong phiên bản 4 và thay vào đó, một tài liệu sẽ sử dụng Số lượng tài liệu ước tính hoặc Số tài liệu ước tính. Sự khác biệt nằm ở độ chính xác / sử dụng bộ nhớ trong số những thứ khác. Đây là một bài đăng SO thảo luận một chút về nó. -
Đưa ra một số ngẫu nhiên trong số đếm của chúng tôi.
-
Sử dụng
skip()
để "bỏ qua" kết quả phù hợp mong muốn và trả lại kết quả đó.
Đây là một đoạn mã được sửa đổi từ câu trả lời SO này:
// Get the count of all users
User.count().exec(function (err, count) {
// Get a random entry
var random = Math.floor(Math.random() * count)
// Again query all users but only fetch one offset by our random #
User.findOne().skip(random).exec(
function (err, result) {
// Tada! random user
console.log(result)
})
})