从 Pymongo 游标读取 101 个对象立即运行——从 Pymongo 游标读取 102 个对象挂起

时间:2020-12-20 20:35:52

标签: python mongodb pymongo

我对这种行为有点困惑。我有一个 Pymongo 查询,它从集合中的所有记录中获取一个字段(该集合包含 100 万条记录):

from pymongo import MongoClient

client = MongoClient()
db = client.holidays

serials = db.christmas.find({}, {
  '_id': 0,
  'gifts': 1, # this field is an integer
})

然后我将这个字典生成器(每个都有一个键)转换为一个 gifts 值列表,并立即运行:

l = []
for idx, i in enumerate(serials):
  l.append(i['gifts'])
  if idx > 99: break

但是,如果我将最后一行更改为 if idx > 100: break,进程会挂起并且永远不会返回。有谁知道什么可能导致这种行为?欢迎所有建议!

1 个答案:

答案 0 :(得分:0)

无论出于何种原因,我都无法重现您的问题。也许这是一个版本问题(我是 python 3.8.5;pymongo 3.11.0,mongodb 4.2.10)。我加载了一个包含 1M(尽管很小)文档的示例集合,并且在一台普通 PC 上完成了不到 2.5 秒。如果你得到不同的结果,也许可以尝试升级。

from pymongo import MongoClient
import datetime

db = MongoClient()['mydatabase']

# Uncomment the next line to load the sample data
# db.mycollection.insert_many([{'gifts': x} for x in range(1000000)]) 

start_time = datetime.datetime.now()

l = [x['gifts'] for x in db.mycollection.find({}, {'_id': 0, 'gifts': 1})]

print(f'{(datetime.datetime.now() - start_time).total_seconds()} Seconds')
print(len(l))

印刷品:

2.383489 Seconds
1000000