A ideia por trás de obter um registro aleatório é consultar todos os registros correspondentes, mas apenas obter um. Isto é o que
findOne()
faz sem nenhum critério dado. Então você vai querer escolher uma entrada aleatória em todas as partidas possíveis. Isso é feito por:
-
Descubra quantas entradas possíveis podem existir - usamoscount()
na coleção para isso. Observe que, conforme mencionado nos comentários,count
está obsoleto na versão 4 e deve-se usar estimadoDocumentCount ou countDocuments em vez disso. A diferença está no uso de precisão/memória, entre outras coisas. Aqui está um post SO discutindo um pouco.
-
Invente um número aleatório dentro de nossa contagem.
-
Useskip()
para "pular" para a correspondência desejada e devolvê-la.
Aqui está um trecho modificado desta resposta SO:
// 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)
})
})