我定义了与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
答案 0 :(得分:1)
当您第一次在文档类上调用.objects
时,mongoengine会尝试创建不存在的索引。
在这种情况下,它在asset
集合上创建索引的过程中失败(索引的详细信息来自您的Asset/User
文档类),如错误消息所示:
pymongo.errors.OperationFailure: Index: {...new index details...} already exists with different options {...existing index details...}
。
第二次调用时,mongoengine假定已创建索引,并且不再尝试再次创建索引,这说明了第二次调用通过的原因。