Прямо сейчас сталкиваюсь с довольно странной проблемой, с которой мне бы хотелось помочь. По какой-то причине приведенный ниже код запускается, когда я добавляю бессмысленное ограничение (как количество документов в коллекции), но когда я удаляю ограничение, несмотря на то, что результат равен тому же объему, время ожидания запроса истекает. Любая помощь очень ценится!
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 о выполнении операторов объяснения, похоже, что основная причина этого - выигрышный план Пимонго, различающийся междудва запроса:
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}"""
Я собираюсь пока оставить этот вопрос открытым, поскольку, хотя у меня теперь есть лучшее представление о том, что происходит, было бы замечательно, если бы кто-то мог ответить:
- Почему другой выигрышный план запроса?
- Почему этот другой план намного медленнее?
Планируя открыть билет на Git Pymongo, просто хочуубедитесь, что здесь нет никаких очевидных шагов настройки, которые я пропускаю.