Die Idee hinter dem Abrufen eines zufälligen Datensatzes besteht darin, alle übereinstimmenden Datensätze abzufragen, aber nur einen zu erhalten. Das ist findOne()
verzichtet auf vorgegebene Kriterien.
Dann möchten Sie einen zufälligen Eintrag in allen möglichen Übereinstimmungen auswählen. Dies geschieht durch:
-
Finden Sie heraus, wie viele mögliche Einträge es geben könnte - wir verwenden
count()
auf der Sammlung dafür. Beachten Sie, dass, wie in den Kommentaren erwähnt,count
ist in Version 4 veraltet und man sollte stattdessen schätzteDocumentCount oder countDocuments verwenden. Der Unterschied liegt unter anderem in der Genauigkeit/Speichernutzung. Hier ist ein SO-Beitrag, in dem es ein wenig diskutiert wird. -
Finden Sie eine Zufallszahl innerhalb unserer Zählung.
-
Verwenden Sie
skip()
um zur gewünschten Übereinstimmung zu "springen" und diese zurückzugeben.
Hier ist ein aus dieser SO-Antwort modifizierter Ausschnitt:
// 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)
})
})