L'idea alla base di ottenere un record casuale è interrogare tutti i record corrispondenti ma ottenerne uno. Questo è ciò che findOne()
fa senza alcun criterio indicato.
Quindi vorrai scegliere una voce casuale in tutte le possibili corrispondenze. Questo viene fatto da:
-
Scopri quante voci possibili ci possono essere:usiamo
count()
sulla raccolta per questo. Nota che, come menzionato nei commenti,count
è deprecato nella versione 4 e si dovrebbe invece usare stimatoDocumentCount o countDocuments. La differenza sta nella precisione/utilizzo della memoria, tra le altre cose. Ecco un post SO che ne discute un po'. -
Trova un numero casuale nel nostro conteggio.
-
Usa
skip()
per "saltare" alla corrispondenza desiderata e restituirla.
Ecco uno snippet modificato da questa risposta 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)
})
})