Python 获取DuplicateKeyError上的重复值

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:

在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:
        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