关于随机排序结果或随机获取单个记录有许多问题和解答。答案建议添加一个随机字段,在该字段上创建索引,然后进行随机抽取。它看起来像:如何批量向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