javascript - 在 100的Collection 中,javascript MongoDB: 如何查找 10隨機文檔?

  显示原文与译文双语对照的内容
126 0

MongoDB是否能夠在不進行多個查詢的情況下資助隨機文檔的數量?

在載入集合中所有文檔之後,我在JS端實現了 e.g 。

我在JS方面所採用的路徑:

  • 獲取所有數據
  • 創建id的array
  • 無序 shuffle ( 隨機順序)
  • 將 array 連接到所需文檔的數目
  • 創建一個文檔列表,通過在以前的兩個操作中選擇一個,從整個集合中選擇一個。

兩個主要的缺點是我正在載入所有數據- 或者我做多個查詢。

任何建議非常感謝

时间:原作者:0个回答

131 0

這在很久以前得到了回答,並且從那時起,MongoDB已經。

作為另一個答案,MongoDB現在支持聚合框架中的採樣,自版本:

你可以這樣做:

db.products.aggregate([{$sample: {size: 5}}]);//You want to get 5 docs

或者:

db.products.aggregate([
 {$match: {category:"Electronic Devices"}},//filter the results
 {$sample: {size: 5}}//You want to get 5 docs
]);

但是,有一些關於運算符的警告

在Nov年,如果不滿足任何條件,則最新版本為 3.4

  • $sample 是管道的第一個階段
  • N 是集合中的總文檔的LESS 于 5%
  • 集合包含 100個文檔

如果未滿足任何 above 條件,$sample 將執行收集掃描,然後執行隨機排序以選擇N 個文檔。

就像最後一個帶有 $match的例子

舊答案

你可以始終運行:

db.products.find({category:"Electronic Devices"}).skip(Math.random()*YOUR_COLLECTION_SIZE)

但這個訂單不是隨機的,你需要兩個查詢( 獲得YOUR_COLLECTION_SIZE的次數) 或者估計它的大小( 大約 100記錄 1000,約) 。

你還可以向所有具有隨機編號的文檔添加一個欄位,並通過該數字查詢。缺點是每次運行相同的查詢時都會得到相同的結果。要修復你總是可以以使用限制和跳過,甚至使用排序。你也可以每次獲取記錄( 。表示更多查詢) 時更新這些隨機數字。

--I不知道你是否使用了 Mongoose,Mondoid或者直接的,驅動程序,所以我將全部寫入,。

因此,假設產品記錄如下所示:

{
 _id: ObjectId("..."),
 name:"Awesome Product",
 category:"Electronic Devices",
}

我建議使用:

{
 _id: ObjectId("..."),
 name:"Awesome Product",
 category:"Electronic Devices",
 _random_sample: Math.random()
}

然後你可以:

db.products.find({category:"Electronic Devices",_random_sample:{$gte:Math.random()}})

然後,可以定期運行,以便定期更新文檔欄位的_random_sample:

var your_query = {}//it would impact in your performance if there are a lot of records
your_query = {category:"Electronic Devices"}//Update 
//upsert = false, multi = true
db.products.update(your_query,{$set:{_random_sample::Math.random()}},false,true)

或者者只要你檢索一些記錄,你可以以更新所有的記錄或者者只有幾個( 取決於你檢索的記錄) 。

for(var i = 0; i <records.length; i++){
 var query = {_id: records[i]._id};
//upsert = false, multi = false
 db.products.update(query,{$set:{_random_sample::Math.random()}},false,false);
}

編輯

請注意

db.products.update(your_query,{$set:{_random_sample::Math.random()}},false,true)

因為它會更新所有與你的查詢匹配的產品,所以它的工作不太正常,你可以用相同的隨機數。最後一種方法效果更好( 在檢索文檔時更新一些文檔)

原作者:
149 5

從 3.2開始,從集合中獲取文檔隨機樣本的簡單方法如下:

$sample 新版本 3.2.

從輸入中隨機選擇指定數量的文檔。

$sample 階段具有以下語法:

{ $sample: { size: <positive integer> } }

源:MongoDB文檔管理器

在這種情況下:

db.products.aggregate([{$sample: {size: 10}}]);
原作者:
...