Лучшие способы обработки исключений MongoDB - PullRequest
8 голосов
/ 09 мая 2011

Я работаю над модулем аутентификации на основе MongoDB для моего приложения asp.net.База данных MongoDB содержит коллекции пользователей, в которых я храню информацию для входа - имя пользователя, адрес электронной почты и пароль.И имя пользователя, и адрес электронной почты установлены как уникальные:

users.ensureIndex({email:1}, {unique:1})
users.ensureIndex({uname:1}, {unique:1})

Теперь, если я пытаюсь вставить запись с существующим uname или email, я получаю исключение MongoDB:

Safemode detected an error: E11000 duplicate key error index: 
authdb.users.$email_1  dup key: { : "test@test.com" } 
(response: { "err" : "E11000 duplicate key error index: authdb.users.$email_1  
dup key: { : \"test@test.com\" }", "code" : 11000, "n" : 0, "connectionId" : 9, 
"ok" : 1.0 })

Iнужно сообщить пользователю, что введенное имя пользователя или адрес электронной почты уже существует, но все исключение - это просто кусок текста, и чтобы увидеть, что происходит, я должен догадаться, посмотрев, есть ли в "$ email" или "$ uname"текст сообщения об ошибке.Есть ли какой-то синтаксический анализатор для исключений MongoDB, который помог бы мне определить, для чего предназначено исключение?

Ответы [ 2 ]

7 голосов
/ 09 мая 2011

Я создал запрос функции в трекере ошибок MongoDB, чтобы добавить дополнительные поля к выводу getLastError при ошибках дубликата ключа.Пожалуйста, проголосуйте за него по номеру https://jira.mongodb.org/browse/SERVER-3069.

. Пока это не будет реализовано, для вашего случая использования вы можете просто проверить, содержит ли строка ошибки «email» или «uname», и извлечь дублированное значение из документа, который вы только чтопытался вставить.Это не так элегантно, как могло бы быть, но пока должно работать.

1 голос
/ 24 июля 2015

С драйвером c # MongoDB 1.xa дубликат можно обнаружить следующим образом:

try
{
    collection.Insert(doc);
}
catch (MongoWriteConcernException ex)
{
    if (ex.Code == 11000)
        throw new YourConflictException("User already exists for username and/or email");
    else
        throw ex;
}

С драйвером c # MongoDB 2.x см. https://stackoverflow.com/a/30309874/516748

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

...