2013-02-01 11 views

Odpowiedz

26

Znalazłem tę statyczną funkcję schematu mangusty w geście GitHub, który powinien osiągnąć to, czego szukasz. Zlicza liczbę dokumentów w kolekcji, a następnie zwraca jeden dokument po pominięciu losowej kwoty.

QuoteSchema.statics.random = function(callback) { 
    this.count(function(err, count) { 
    if (err) { 
     return callback(err); 
    } 
    var rand = Math.floor(Math.random() * count); 
    this.findOne().skip(rand).exec(callback); 
    }.bind(this)); 
}; 

Źródło: https://gist.github.com/3453567

NB ja zmodyfikował kod trochę aby uczynić go bardziej czytelnym.

+0

Cool. Wiesz, jak to może być przeniesione na CoffeeScript? – user1680104

+0

Nie, przepraszam! Muszę jeszcze nauczyć się pisać CoffeeScript. – matthewtole

+0

Okay, to nie działało, więc nie byłem pewien (to był problem w pierwszym przypadku), ale ponieważ wciąż napotykam problem z wbudowanym Javscript. To dość dziwne. Funkcja wewnątrz funkcji (wywołanie zwrotne) {} nigdy nie jest wywoływana. Może jakiś problem z połączeniem DB. Spróbuję to rozgryźć. – user1680104

6

Zaimplementowałam wtyczkę dla mangusty, która robi to w bardzo wydajny sposób przy użyciu zapytania $ near na dwóch losowo wygenerowanych współrzędnych przy użyciu indeksu 2dsphere. Sprawdź to tutaj: https://github.com/matomesc/mongoose-random.

11

Jeśli nie chcesz dodawać kodu "testowego" do swojego schematu, używa to zapytań Mongoose.

Model.count().exec(function(err, count){ 

    var random = Math.floor(Math.random() * count); 

    Model.findOne().skip(random).exec(
    function (err, result) { 

     // result is random 

    }); 

}); 
+0

Znalazłem to łatwe do wdrożenia – chris31389

+0

Co powiesz na wiele dokumentów w jednym zapytaniu. Czy istnieje inne, łatwiejsze rozwiązanie niż wielokrotne wysyłanie zapytań? – codersaif

+0

@codersaif To nie jest to, czego chcesz użyć do tego. Funkcja pominięcia jest kierowana na paginację i jest kursorem, [kursorem mongody] (https://docs.mongodb.com/manual/reference/method/cursor.skip/). Spowoduje to przesunięcie kursora do określonej pozycji i będzie czytane do przodu. Kod w mojej odpowiedzi to w zasadzie paginacja, 'Model.findOne(). Skip (100) .limit (1) .exec()' ale pobiera pojedynczy dokument. –

Powiązane problemy