【问题标题】:Why MongoEngine/pymongo giving error when trying to access object first time only为什么 MongoEngine/pymongo 在尝试仅第一次访问对象时会出错
【发布时间】:2019-08-24 23:17:38
【问题描述】:

我已经定义了与 MongoDB 映射的 MongoEngine 类。当我尝试使用 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 行,在 get 中的文件“/usr/local/lib/python3.5/dist-packages/mongoengine/queryset/manager.py”,第 37 行 查询集 = 查询集类(所有者,所有者。_get_collection()) _get_collection 中的文件“/usr/local/lib/python3.5/dist-packages/mongoengine/document.py”,第 209 行 cls.ensure_indexes() 文件“/usr/local/lib/python3.5/dist-packages/mongoengine/document.py”,第 765 行,在 ensure_indexes collection.create_index(字段,背景=背景,**选择) 文件“/usr/local/lib/python3.5/dist-packages/pymongo/collection.py”,第 1754 行,在 create_index self.__create_index(keys, kwargs, session, **cmd_options) 文件“/usr/local/lib/python3.5/dist-packages/pymongo/collection.py”,第 1656 行,在 __create_index 会话=会话) _command 中的文件“/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) _check_command_response 中的文件“/usr/local/lib/python3.5/dist-packages/pymongo/helpers.py”,第 145 行 引发 OperationFailure(msg % errmsg,代码,响应) pymongo.errors.OperationFailure:索引:{ v:2,键:{ org:1,_fts:“text”,_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:“english”,背景:false,language_override:“language”,textIndexVersion:3}已经存在不同的选项:{ v: 2, key: { org: 1, _fts: "text", _ftsx: 1 }, name: "org_1_name_text_description_text_content_text_tag_content_text_remote.source_text", ns: "digitile.asset", default_language: "english",背景:假,权重:{内容: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

【问题讨论】:

    标签: python python-3.x pymongo mongoengine


    【解决方案1】:

    当您第一次在文档类上调用 .objects 时,mongoengine 会尝试创建不存在的索引。

    在这种情况下,它在 asset 集合上创建索引时失败(索引的详细信息来自您的 Asset/User 文档类),正如您在错误消息中看到的那样: pymongo.errors.OperationFailure: Index: {...new index details...} already exists with different options {...existing index details...}.

    第二次调用时,mongoengine 假定索引已创建并且不再尝试创建它,这就解释了第二次调用通过的原因。

    【讨论】:

      猜你喜欢
      • 2019-08-15
      • 1970-01-01
      • 1970-01-01
      • 2019-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-31
      相关资源
      最近更新 更多