我想創建一個Schema.statics.random
函數,該函數從集合中獲取一個隨機元素。我知道有一個本地MongoDB驅動程序的例子,但我無法在Mongoose中使用它。來自Mongoose中的一個集合的隨機文檔
回答
我在一個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我修改代碼中的位,以使其更易於閱讀。
我已經實現了一個用於貓鼬的插件,它以一種非常有效的方式對使用2dsphere索引的兩個隨機生成的座標使用$ near查詢來執行此操作。看看這裏:https://github.com/matomesc/mongoose-random。
如果您不想在模式中添加「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
});
});
我發現這很容易實現 – chris31389
如何在一個查詢多個文檔。除多次查詢外,是否有更簡單的解決方案? – codersaif
@codersaif這不是你想用的。 skip函數針對分頁,並且是一個遊標,[mongodb cursor](https://docs.mongodb.com/manual/reference/method/cursor.skip/)。這會將光標移動到特定的位置,並且意味着向前讀取。我的答案中的代碼基本上是分頁,'Model.findOne()。skip(100).limit(1).exec()'但是獲取單個文檔。 –
- 1. MongoDB:從集合中提取多個隨機文檔
- 2. 用Mongoose將文檔移動到另一個集合
- 3. 統一隨機訪問一個集合
- 4. 如何在Mongoose中嵌入文檔的字段集合
- 5. 文檔在一個集合的MongoDB
- 6. MongoDB:如何在100個集合中找到10個隨機文檔?
- 7. 從另一個集合中匹配的一個mongo集合中刪除文檔
- 8. MongoDB/Node:將集合中的文檔的一部分插入另一個集合中的文檔
- 9. 擷取來自每個模型的隨機項目的集合,在骨幹
- 10. Java隨機集合
- 11. 如何在qooxdoo表中管理來自mongoose/mongodb的子文檔?
- 12. MongoDB集合中的唯一文檔
- 13. Mongoose JS:在一個文檔中創建一個引用到另一個文檔中的嵌入文檔
- 14. Node,MongoDB,Mongoose Design Choice - 創建兩個集合或一個集合
- 15. 根據位於另一個集合中的值刪除集合中的文檔
- 16. Mongoose/Mongodb嵌入式文檔中的前一個和下一個
- 17. 來自R數據集子集的行的隨機樣本
- 18. Vector3點集合中的隨機點
- 19. 集合中的隨機數字
- 20. 選擇集合中的隨機元素
- 21. 使用LINQ生成一個隨機數的隨機大小集合
- 22. Mongoid隨機文檔
- 23. 來自序列的唯一隨機int
- 24. 從一個集合中選擇N個隨機數
- 25. 來自Dictionary的隨機值?
- 26. 來自excel的10個隨機行
- 27. MySQL查詢接收來自兩個表的隨機組合
- 28. 來自Mongoose的TypeError
- 29. 如何連接到同一個集合中的兩個文檔
- 30. 從另一個集合中尚不存在的集合中獲取一個隨機項目 - LINQ?
很酷。你知道這可以轉化爲CoffeeScript嗎? – user1680104
不,對不起!我還沒有學習如何編寫CoffeeScript。 – matthewtole
好吧,它沒有工作,所以我不確定(這是第一種情況下的問題),但因爲我仍然面臨內聯Javscript的問題。這很奇怪。函數內部的東西(回調){}永遠不會被調用。可能與DB-Connection有一些問題。我會試着弄明白。 – user1680104