Ideą uzyskania losowego rekordu jest zapytanie o wszystkie pasujące rekordy, ale po prostu uzyskanie jednego. To właśnie findOne()
robi bez podanych kryteriów.
Wtedy będziesz chciał wybrać losowy wpis we wszystkich możliwych meczach. Odbywa się to przez:
-
Dowiedz się, ile może być możliwych wpisów — używamy
count()
na kolekcji do tego. Zauważ, że, jak wspomniano w komentarzach,count
jest przestarzałe w wersji 4 i zamiast tego należy użyć wartości managedDocumentCount lub countDocuments. Różnica polega między innymi na precyzji/wykorzystaniu pamięci. Oto post SO, który trochę to omawia. -
Wymyśl losową liczbę w ramach naszego licznika.
-
Użyj
skip()
aby "przeskoczyć" do żądanego dopasowania i zwrócić to.
Oto fragment zmodyfikowany na podstawie tej odpowiedzi na 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)
})
})