Почему MongoEngine / pymongo выдает ошибку при попытке доступа к объекту только в первый раз

#python #python-3.x #pymongo #mongoengine

#python #python-3.x #pymongo #mongoengine

Вопрос:

Я определил классы MongoEngine, которые сопоставляются с MongoDB. Когда я пытаюсь получить доступ к данным с помощью MongoEngine, в определенном коде он терпит неудачу с первой попытки, но успешно возвращает данные со второй попытки с тем же кодом. Выполнение кода в терминале python

 from Project.Mongo import User
user = User.objects(username = 'xyz@xyz.com').first()

from Project.Mongo import Asset
Asset.objects(org = user.org)
  

Последняя строка кода генерирует следующую ошибку при первой попытке.

Обратная трассировка (последний последний вызов): файл «», строка 1, в файле «/usr/local/lib/python3.5/dist-packages/mongoengine/queryset/manager.py «, строка 37, в get queryset = queryset_class(владелец, owner._get_collection()) Файл «/usr/local/lib/python3.5/dist-packages/mongoengine/document.py «, строка 209, в файле _get_collection cls.ensure_indexes() «/usr/local/lib/python3.5/dist-packages/mongoengine/document.py «, строка 765, в коллекции ensure_indexes.create_index(поля, background= фон, ** варианты) Файл «/usr/local/lib/python3.5/dist-packages/pymongo/collection.py «, строка 1754, в create_index self.__create_index(ключи, kwargs, сессия, **cmd_options) Файл «/usr/local/lib/python3.5/dist-packages/pymongo/collection.py «, строка 1656, в файле __create_index session=сессия) «/usr/local/lib/python3.5/dist-packages/pymongo/collection.py «, строка 245, в _command retryable_write=retryable_write) Файл «/usr/local/lib/python3.5/dist-packages/pymongo/pool.py «, строка 517, в файле сопоставления команд=collation) «/usr/local/lib/python3.5/dist-packages/pymongo/network.py «, строка 125, в команде parse_write_concern_error=parse_write_concern_error) Файл «/usr/local/lib/python3.5/dist-packages/pymongo/helpers.py «, строка 145, в _check_command_response вызывает ошибку OperationFailure(сообщение % errmsg, код, ответ) pymongo.ошибки.Ошибка операции: Индекс: { v: 2, ключ: { org: 1, _fts: «текст», _ftsx: 1 }, имя: «org_1_name_content_text_description_text_content_text_tag_content_text_remote.source_text», ns: «digitile.asset», веса: { содержимое: 3, описание: 1, name_content: 10, remote.owner__name: 20, remote.source: 2, tag_content: 2 }, default_language: «английский», background: false, language_override: «язык», textIndexVersion: 3 } уже существует с различными параметрами: { v: 2, key: { org: 1, _fts: «текст», _ftsx: 1 }, name: » org_1_name_text_description_text_content_text_tag_content_text_remote.source_text», ns: «digitile.asset», default_language: «английский», background: false, веса: { содержимое: 3, описание: 1, имя: 10, remote.owner__name: 20, remote.source: 2, tag_content: 2 }, language_override: «язык», textIndexVersion: 3 }

Когда я повторяю ту же последнюю строку во второй раз, это дает точный результат

Я использую python 3.5.2 pymongo 3.7.2 mongoengine 0.10.6

Ответ №1:

При первом вызове .objects класса document mongoengine пытается создать индексы, если они не существуют.

В этом случае происходит сбой при создании индекса в asset коллекции (подробные индексы взяты из ваших Asset/User классов документов), как вы можете видеть в сообщении об ошибке: pymongo.errors.OperationFailure: Index: {...new index details...} already exists with different options {...existing index details...} .

Во второй раз, когда вы выполняете этот вызов, mongoengine предполагает, что индексы были созданы, и не пытается создать его снова, что объясняет, почему второй вызов проходит.