allow_disk_use не работает с курсором в PyMongo

#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 (упомянутые в вопросе), также работают отлично.