python - pymongo.find() 超时但使用与集合相同体积的限制

标签 python mongodb pymongo

现在遇到一个相当奇怪的问题,我希望得到一些帮助。无论出于何种原因,当我添加无意义的限制(作为集合中的文档数量)时,下面的代码都会运行,但是当我删除该限制时,尽管结果是相同的卷,请求也会超时。非常感谢任何帮助!

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}"""

我将暂时保留这个问题,因为虽然我现在对正在发生的事情有了更好的了解,但如果有人可以回答,那就太好了:

  1. 为什么采用不同的获胜查询计划?
  2. 为什么这个不同的计划慢得多?

计划在 pymongo git 上开票,只是想确保这里没有遗漏任何明显的配置步骤。

最佳答案

您是否尝试过使用 .explain("executionStats") 运行查询来尝试弄清楚发生了什么?

关于python - pymongo.find() 超时但使用与集合相同体积的限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58494685/

相关文章:

python - 如何限制 haar 级联检测到的面孔数量

python - 如何在生成器上使用 random.shuffle()? Python

python - "or"似乎没有在 Python 中发挥应有的作用

json - GSON 将带有日历的对象反序列化为带有 Mongo 日期的 json 并返回

python - 将 pycurl 与 gzip 流一起使用时出现错误 "Extra data: line 2 column 1"

python - Matplotlib 字符串 xticks

javascript - 想要检查用户是否已经存在 MongoDB

php - 编写 MongoDB 插入语句

python - 如何使用pymongo将日期时间字符串作为ISODate插入Mongodb

python - Windows Azure 网站 python