python - 如何使用python从mongoDB中的10亿个文档中获取随机单个文档?

标签 python mongodb pymongo

<分区>

我想要来自 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

python - MongoDB/PyMongo : BadValue Unsupported projection option when trying to query all dates after

python - pymongo+update 抛出 $pull

mongodb - 使用pymongo修复mongodb数据库