2013-12-05 2 views
3

В pymongo, когда поймано DuplicateKeyError, что это правильный способ узнать дублирующее значение за исключением?Получите дублирующее значение на 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 

EDIT

Это параллельное приложение, так что проверить дубликаты прежде чем вставка может завершиться неудачей.

Поле представляет собой массив, поэтому трудно определить, какой из них является дублирующимся значением.

+1

Почему бы не проверить, если ключ уже присутствует первым? Вместо управления потоком через исключения? –

+1

@InbarRose Иногда ключ может отсутствовать при проверке, но затем сразу же вставляется другим процессом/нитью ... – neuront

+0

Это абсолютно актуальная проблема (вы должны объяснить это в своем вопросе). Кроме того, почему вы не можете просто получить доступ к db, используя ключ, который вы намеревались использовать изначально? 'DuplicateKeyError' означает, что ключ тот же, поэтому у вас уже есть ключ, тогда вы можете просто получить доступ к его значению. –

ответ

7

В Dev версии pymongo (2.7) вы можете проверить с error_document собственности:

try: 
    db.coll.insert({name: 'some_value'}) 
except pymongo.errors.DuplicateKeyError, e: 
    print e.error_document 

Насколько я знаю, в 2,6 и более ранних версиях, все данные, за исключением ошибки msg и code отбрасывается.

+0

К сожалению, я надеюсь, что они принесут это к стабильному выпуску как можно скорее. Вы хотите поделиться ссылкой об этой функции? – neuront

+0

@neuront no docs для нестабильной версии, поэтому единственная ссылка [источник] (https://github.com/mongodb/mongo-python-driver/blob/c0614bae1b82dc1b304bf3242e2130e5f52f72ac/pymongo/errors.py#L60) – alko

+0

Примечание: в pymongo (3.0+), вы можете печатать 'e.message', к сожалению. – okoboko

Смежные вопросы