2013-02-01 34 views

回答

26

我在一個GitHub Gist中發現了這個Mongoose Schema靜態函數,它應該實現你的目標。它計算集合中的文檔數量,然後在跳過隨機數量後返回一個文檔。

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)); 
}; 

來源:https://gist.github.com/3453567

NB我修改代碼中的位,以使其更易於閱讀。

+0

很酷。你知道這可以轉化爲CoffeeScript嗎? – user1680104

+0

不,對不起!我還沒有學習如何編寫CoffeeScript。 – matthewtole

+0

好吧,它沒有工作,所以我不確定(這是第一種情況下的問題),但因爲我仍然面臨內聯Javscript的問題。這很奇怪。函數內部的東西(回調){}永遠不會被調用。可能與DB-Connection有一些問題。我會試着弄明白。 – user1680104

6

我已經實現了一個用於貓鼬的插件,它以一種非常有效的方式對使用2dsphere索引的兩個隨機生成的座標使用$ near查詢來執行此操作。看看這裏:https://github.com/matomesc/mongoose-random

11

如果您不想在模式中添加「test like」代碼,則會使用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

我發現這很容易實現 – chris31389

+0

如何在一個查詢多個文檔。除多次查詢外,是否有更簡單的解決方案? – codersaif

+0

@codersaif這不是你想用的。 skip函數針對分頁,並且是一個遊標,[mongodb cursor](https://docs.mongodb.com/manual/reference/method/cursor.skip/)。這會將光標移動到特定的位置,並且意味着向前讀取。我的答案中的代碼基本上是分頁,'Model.findOne()。skip(100).limit(1).exec()'但是獲取單個文檔。 –

相關問題