L'idée derrière l'obtention d'un enregistrement aléatoire est d'interroger tous les enregistrements correspondants mais d'en obtenir un seul. C'est ce que findOne()
fait sans aucun critère donné.
Ensuite, vous voudrez choisir une entrée au hasard dans toutes les correspondances possibles. Ceci est fait par :
-
Découvrez combien d'entrées possibles il pourrait y avoir - nous utilisons
count()
sur la collecte pour cela. Notez que, comme mentionné dans les commentaires,count
est obsolète dans la version 4 et il convient d'utiliser la valeur estimateDocumentCount ou countDocuments à la place. La différence réside, entre autres, dans la précision/l'utilisation de la mémoire. Voici un article SO qui en parle un peu. -
Trouvez un nombre aléatoire dans notre décompte.
-
Utilisez
skip()
pour "passer" à la correspondance souhaitée et la renvoyer.
Voici un extrait modifié de cette réponse 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)
})
})