现在遇到一个相当奇怪的问题,我希望得到一些帮助。无论出于何种原因,当我添加无意义的限制(作为集合中的文档数量)时,下面的代码都会运行,但是当我删除该限制时,尽管结果是相同的卷,请求也会超时。非常感谢任何帮助!
from pymongo import MongoClient
import pandas as pd
mongodb = MongoClient('mongodb://%s:%s@%s:%s' % (username, password, host, port))
numdocs = mongodb[collection].count_documents({})
##800,000
#Runs in 11.7s
results = pd.DataFrame(list(mongodb[collection].find({}).limit(numdocs)))
#Times out, or runs 1hr+ mins
results = pd.DataFrame(list(mongodb[collection].find({})))
更新 10/22
感谢 @phalanx 的运行解释语句的记录,看起来这个问题的根本原因是 pymongo 的获胜计划在两个查询之间有所不同:
mongodb[collection].find({}).explain()
"""{'queryPlanner': {'plannerVersion': 1,
'namespace': 'mongodb.collection',
'winningPlan': {'stage': 'COLLSCAN'}},
'serverInfo': {'host': 'mongodbhost',
'port': 27017,
'version': '3.6.0'},
'ok': 1.0}"""
mongodb[collection].find({}).limit(numdocs).explain()
"""
{'queryPlanner': {'plannerVersion': 1,
'namespace': 'mongodb.collection',
'winningPlan': {'stage': 'SUBSCAN',
'inputStage': {'stage': 'LIMIT_SKIP',
'inputStage': {'stage': 'COLLSCAN'}}}},
'serverInfo': {'host': 'mongodbhost',
'port': 27017,
'version': '3.6.0'},
'ok': 1.0}"""
我将暂时保留这个问题,因为虽然我现在对正在发生的事情有了更好的了解,但如果有人可以回答,那就太好了:
- 为什么采用不同的获胜查询计划?
- 为什么这个不同的计划慢得多?
计划在 pymongo git 上开票,只是想确保这里没有遗漏任何明显的配置步骤。
最佳答案
您是否尝试过使用 .explain("executionStats") 运行查询来尝试弄清楚发生了什么?
关于python - pymongo.find() 超时但使用与集合相同体积的限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58494685/