python - 为什么 MongoEngine/pymongo 仅在第一次尝试访问对象时出错

标签 python python-3.x pymongo mongoengine

我已经定义了与 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)

代码的最后一行在第一次尝试时生成以下错误。

回溯(最近一次调用最后一次): 文件“”,第 1 行,位于 文件“/usr/local/lib/python3.5/dist-packages/mongoengine/queryset/manager.py”,第 37 行,在 get 中 查询集=查询集_类(所有者,所有者._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中 collection.create_index(字段, 背景=背景, **opts) 文件“/usr/local/lib/python3.5/dist-packages/pymongo/collection.py”,第 1754 行,在 create_index 中 self.__create_index(键、kwargs、 session 、**cmd_options) 文件“/usr/local/lib/python3.5/dist-packages/pymongo/collection.py”,第 1656 行,在 __create_index 中 session = session ) 文件“/usr/local/lib/python3.5/dist-packages/pymongo/collection.py”,第 245 行,在 _command 中 可重试写入=可重试写入) 文件“/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 中 引发操作失败(消息% 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:“英语”,背景:false,language_override:“语言”,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 蒙戈引擎0.10.6

最佳答案

第一次在文档类上调用 .objects 时,mongoengine 会尝试创建索引(如果索引不存在)。

在这种情况下,在 asset 集合上创建索引时会失败(索引的详细信息取自您的 Asset/User 文档类),如您所见在错误消息中: pymongo.errors.OperationFailure:索引:{...新索引详细信息...}已存在,具有不同的选项{...现有索引详细信息...}

第二次进行该调用时,mongoengine 假定索引已创建,并且不会尝试再次创建索引,这解释了为什么第二次调用会通过。

关于python - 为什么 MongoEngine/pymongo 仅在第一次尝试访问对象时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55494951/

相关文章:

python - 如何在 Python 中向 DF 添加/估算额外的行

python re sub 与 findall

python - 计算从一种模型到另一种模型的字段数量 - Odoo v8

python - 为什么当用户输入1或2以外的任何内容时,我的 'else: mainError()'无法执行?例如。 @或a或3以上的任何数字

python - 将 __del__ 与适当的属性方法一起使用

python - 如何在 pymongo 中进行条件搜索?

python - 如何仅返回特定文件类型的文件?

python-3.x - 遍历列表字典并更新相应的列 - pandas

Python3,MongoDB仅在文档不存在时插入

python-3.x - 无法使用 python (pymongo) 将 Jsonfile 插入 mongodb (错误 : bson. 错误。InvalidDocument: key '$oid' 不得以 '$' 开头)