#python #python-3.x #mongodb #pymongo #pymongo-3.x
#python #python-3.x #mongodb #pymongo #pymongo-3.x
Вопрос:
>>> from pymongo import MongoClient
>>> client = MongoClient()
>>> db = client['cvedb']
>>> db.list_collection_names()
['cpeother', 'mgmt_blacklist', 'via4', 'capec', 'cves', 'mgmt_whitelist', 'ranking', 'cwe', 'info', 'cpe']
>>> colCVE = db["cves"]
>>> cve = colCVE.find().sort("Modified", -1) # this works
>>> cve_ = colCVE.find().allow_disk_use(True).sort("Modified", -1) # this doesn't work
AttributeError: 'Cursor' object has no attribute 'allow_disk_use'
>>> cve_ = colCVE.find().sort("Modified", -1).allow_disk_use(True) # this doesn't work
AttributeError: 'Cursor' object has no attribute 'allow_disk_use'
>>> cve.allow_disk_use(True) # this doesn't work
AttributeError: 'Cursor' object has no attribute 'allow_disk_use'
>>>
Я хочу использовать allow_disk_use()
метод, но получаю вышеупомянутую ошибку. Мой сервер MongoDB — 4.4.1, и pymongo также имеет последнюю версию.
Я ссылался на документацию и исходный код, но я не могу понять, что я делаю не так. Не предполагается работать с Cursor
объектами? было бы хорошо, если бы кто-нибудь мог объяснить правильный подход и почему это не работает.
Ответ №1:
В pymongo вы можете использовать allowDiskUse
в сочетании с aggregate
:
cve_ = colCVE.aggregate([{"$sort": {"Modified": -1}}], allowDiskUse=True)
Начиная с версии 3.11, вы также можете передать его в find()
:
cve_ = colCVE.find(allow_disk_use=True).sort("Modified", pymongo.DESCENDING)
Комментарии:
1. Спасибо, это сработало! есть ли какие-либо документы, касающиеся того, что он работает только в aggregate? как вы его нашли? в соответствии с этим docs.mongodb.com/manual/reference/method/cursor.allowDiskUse /… , он должен работать с курсором
2. Я должен исправить себя. Смотрите мой отредактированный ответ. Вы должны передать его в find-command вместо sort() .
3. аргумент внутри sort, похоже, не работает,
TypeError: __init__() got an unexpected keyword argument 'allow_disk_use'
4. Вы должны передать ‘allow_disk_use’ для поиска, а не сортировки, как предложено в моем ответе.
5. да, я перешел на поиск и получил ошибку, указанную в приведенном выше комментарии
Ответ №2:
В дополнение к ответу Бичи, после обновления до последней версии (3.11) запросы, которые выдавались AttributeError
(упомянутые в вопросе), также работают отлично.