为什么仅在初次尝试访问对象时,MongoEngine / pymongo会给出错误

时间:2019-04-03 12:15:07

标签: 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行     queryset = queryset_class(owner,owner._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     collection.create_index(fields,background = background,** opts)   在create_index中,文件“ /usr/local/lib/python3.5/dist-packages/pymongo/collection.py”,行1754     self .__ create_index(keys,kwargs,session,** cmd_options)   __create_index中的文件“ /usr/local/lib/python3.5/dist-packages/pymongo/collection.py”,行1656     会话=会话)   _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:“文本”,_ftsx:1},名称:“ org_1_name_content_text_description_text_content_text_tag_content_text_remote.source_text”,ns:“ digitile.asset”,权重:内容:3,描述:1,名称内容:10,remote.owner__名称:20,remote.source:2,tag_content:2},default_language:“英语”,背景:false,language_override:“ language”,textIndexVersion:3}存在以下选项:{v:2,key:{org:1,_fts:“ text”,_ftsx:1},name:“ org_1_name_text_description_text_content_text_text_tag_content_text_remote.source_text”,ns:“ digitile.asset”,default_language:“ english”,背景:false,权重:{内容:3,描述:1,名称:10,remote.owner__name:20,remote.source:2,tag_content:2},language_override:“ language”,textIndexVersion:3}

当我第二次尝试相同的最后一行时,它会产生准确的结果

我正在使用python 3.5.2 pymongo 3.7.2 mongoengine 0.10.6

1 个答案:

答案 0 :(得分:1)

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

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

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