我对这种行为有点困惑。我有一个 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
,进程会挂起并且永远不会返回。有谁知道什么可能导致这种行为?欢迎所有建议!
答案 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