Python 获取DuplicateKeyError上的重复值
在pymongo中,当捕获到Python 获取DuplicateKeyError上的重复值,python,python-2.7,pymongo,Python,Python 2.7,Pymongo,在pymongo中,当捕获到DuplicateKeyError时,如何正确地找出异常背后的重复值 目前我是这样做的 try: db.coll.insert({key: ['some_value', 'some_value_1']}) except pymongo.errors.DuplicateKeyError, e: dups = re.findall(r'\{\ +:\ +"(.*)"\ +\}$', e.message) if len(dups) == 1:
DuplicateKeyError
时,如何正确地找出异常背后的重复值
目前我是这样做的
try:
db.coll.insert({key: ['some_value', 'some_value_1']})
except pymongo.errors.DuplicateKeyError, e:
dups = re.findall(r'\{\ +:\ +"(.*)"\ +\}$', e.message)
if len(dups) == 1:
print dups[0]
这似乎有效,但有没有更简单的方法,比如
try:
db.coll.insert({key: ['some_value', 'some_value_1']})
except pymongo.errors.DuplicateKeyError, e:
print e.dup_val
编辑
这是一个并发应用程序,所以在插入可能失败之前检查重复项
该字段是一个数组,因此很难找出哪一个是重复值。在开发版本的
pymongo
(2.7)中,您可以使用error\u document
属性进行检查:
try:
db.coll.insert({name: 'some_value'})
except pymongo.errors.DuplicateKeyError, e:
print e.error_document
据我所知,在2.6和更早版本中,除了error
msg
和code
之外的所有信息都会被丢弃。为什么不先检查密钥是否已经存在?与通过异常管理流程不同?@InbarRose有时在检查时密钥可能不存在,但随后立即被另一个进程/线程插入…这是一个完全正确的问题(您应该在问题中解释)。另外,为什么不能使用最初打算使用的密钥访问数据库?DuplicateKeyError
表示键是相同的,因此您已经拥有了该键,然后您就可以访问它的值。@对不起,我起初没有发布实际的案例。我已经做了一些澄清。哎呀,我希望他们尽快将其稳定发布。你想分享一个关于该功能的链接吗?@neuron没有不稳定版本的文档,因此唯一的链接说明:不幸的是,在pymongo(3.0+)中,你只能打印e.message
。