關於隨機排序結果或隨機獲取單個記錄有許多問題和解答。答案建議添加一個隨機字段,在該字段上創建索引,然後進行隨機抽取。它看起來像:如何批量向MongoDB中的每條記錄添加一個隨機字段
db.myindex.find().forEach(function(doc) {
db.myindex.update({_id: doc._id}, {$set: {rand: Math.random()}})
})
這很好,但它需要幾個小時(大量和大量的數據)。它看起來像寫鎖定是有限的,這是有道理的,因爲更新是爲每個記錄發生的。我如何批量進行此操作?我試過了:
var bulk = db.myindex.initializeUnorderedBulkOp();
bulk.find({}).update({ $set: { rand: Math.random() } });
bulk.execute();
但是它爲每個記錄設置rand域爲相同的值!我該如何解決?
編輯:順便說一下,我需要這樣做的原因是因爲我從其他人那裏得到一個巨大的bson文件,我需要經常導入它,所以不能等待幾個小時才能更新它。
可能你只是稍微等待版本3.2,那麼你可以使用'$ sample'操作符:https://docs.mongodb.org/manual/release-notes/3.2-reference/ – nickmilon