<分区>
我想要来自 mongoDB 集合的单个随机文档。现在我的 mongoDB 集合包含超过 10 亿个集合。如何从该集合中获取单个随机文档?
<分区>
我想要来自 mongoDB 集合的单个随机文档。现在我的 mongoDB 集合包含超过 10 亿个集合。如何从该集合中获取单个随机文档?
最佳答案
我从未在 Python 中使用过 MongoDB,但是对于您的问题有一个通用的解决方案。这是一个用于获取单个随机文档的 MongoDB shell 脚本:
N = db.collection.count(condition)
db.collection.find(condition).limit(1).skip(Math.floor(Math.random()*N))
condition
这里是一个 MongoDB 查询。如果要查询整个集合,请使用 query = null
。
这是一个通用的解决方案,因此它适用于任何 MongoDB 驱动程序。
我运行了一个基准测试来测试几个实现。首先,我创建了包含 5567249 个文档的测试集合,这些文档具有 indexed 随机字段 rnd
。
我选择了三种方法相互比较:
第一种方法:
db.collection.find().limit(1).skip(Math.floor(Math.random()*N))
第二种方法:
db.collection.find({rnd: {$gte: Math.random()}}).sort({rnd:1}).limit(1)
第三种方法:
db.collection.findOne({rnd: {$gte: Math.random()}})
我将每个方法运行 10 次并得到它的平均计算时间:
method 1: 882.1 msec
method 2: 1.2 msec
method 3: 0.6 msec
这个基准表明我的解决方案不是最快的。
但是第三种解决方案也不是很好,因为它使用 rnd > random()
找到数据库中的第一个元素(按自然顺序排序)。所以,它的输出并不是真正随机的。
我认为第二种方法最适合频繁使用。但它有一个缺陷:需要改变整个数据库并确保额外的索引。
关于python - 如何使用python从mongoDB中的10亿个文档中获取随机单个文档?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13524641/
相关文章:
python - 如何在 PyCharm 4.5.3 中*仅*修改 git 提交消息?
python - 为什么我们在从 python 游标执行 sql 查询时需要使用 3 个引号?
python - 如何使用 2 个在 matplotlib 中具有空值的列表绘制图形?
Python feedparser 无法读取 WordPress 自定义提要
node.js - mongodb 中的 $not 运算符不起作用
c# - MongoDB SetDefaultValue 不起作用 - 为什么?
c# - 如何将已弃用的 IMongoQuery 转换为 FilterDefinitionBuilder