Почему MongoEngine / Pymongo выдает ошибку при попытке доступа к объекту только в первый раз - PullRequest
1 голос
/ 03 апреля 2019

Я определил классы 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)

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

Traceback (последний вызов был последним): Файл "", строка 1, в Файл "/usr/local/lib/python3.5/dist-packages/mongoengine/queryset/manager.py", строка 37, в получить queryset = queryset_class (owner, 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, в sure_indexes collection.create_index (поля, фон = фон, ** опции) Файл "/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 сессия = сессия) Файл "/usr/local/lib/python3.5/dist-packages/pymongo/collection.py", строка 245, в _команде retryable_write = retryable_write) Файл "/usr/local/lib/python3.5/dist-packages/pymongo/pool.py", строка 517, в команде сортировки = сортировка) Файл "/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 (msg% errmsg, код, ответ) pymongo.errors.OperationFailure: Index: {v: 2, ключ: {org: 1, _fts: "text", _ftsx: 1}, имя: "org_1_name_content_text_description_text_content_text_tag_content_text_remote.source_text", ns: "digile.set:": содержимое: 3, описание: 1, name_content: 10, remote.owner__name: 20, remote.source: 2, tag_content: 2}, default_language: «english», фон: false, language_override: «language», textIndexVersion: 3} уже существует с различными параметрами: {v: 2, ключ: {org: 1, _fts: "text", _ftsx: 1}, имя: "org_1_name_text_description_text_content_text_tag_content_text_remote.source_text", ns: "digitile.asset", default_language: "english", background: false, весовые коэффициенты: {content: 3, description: 1, name: 10, remote.owner__name: 20, remote.source: 2, tag_content: 2}, language_override: "language", textIndexVersion: 3}

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

Я использую Python 3.5.2 пимонго 3.7.2 mongoengine 0.10.6

1 Ответ

1 голос
/ 04 июня 2019

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

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

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

...