处理MongoDB异常的更好方法

处理MongoDB异常的更好方法,mongodb,mongodb-.net-driver,Mongodb,Mongodb .net Driver,我正在为我的asp.net应用程序开发一个MongoDB支持的身份验证模块。MongoDB数据库有一组用户,我在其中存储登录信息——用户名、电子邮件和密码。用户名和电子邮件都设置为唯一: users.ensureIndex({email:1}, {unique:1}) users.ensureIndex({uname:1}, {unique:1}) 现在,如果我尝试插入一个带有现有uname或电子邮件的记录,我会得到一个MongoDB异常: Safemode detected an error

我正在为我的asp.net应用程序开发一个MongoDB支持的身份验证模块。MongoDB数据库有一组用户,我在其中存储登录信息——用户名、电子邮件和密码。用户名和电子邮件都设置为唯一:

users.ensureIndex({email:1}, {unique:1})
users.ensureIndex({uname:1}, {unique:1})
现在,如果我尝试插入一个带有现有uname或电子邮件的记录,我会得到一个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 })

我需要告诉用户他们输入的用户名或电子邮件已经存在,但整个异常只是一个文本块,要查看发生了什么,我必须通过查看错误消息文本中是否有“$email”或“$uname”来猜测。是否有某种类型的MongoDB异常解析器可以帮助我检测异常的用途?

我在MongoDB的bug tracker中创建了一个功能请求,在getLastError的输出中添加额外的字段以显示重复的密钥错误。请在投票时投赞成票

在实现之前,对于您的用例,您只需检查err字符串是否包含“email”或“uname”,并从您刚刚尝试插入的文档中检索重复的值。它并没有看上去那么优雅,但现在应该可以用了。

使用c#MongoDB驱动程序1.x,可以像这样检测到重复的

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,请参见


但是,如果您想确切地知道解析文本可能需要哪个重复键,那么在这里试一试被认为是一种很好的做法吗?如果我们有一个try-catch,我们应该避免使用异步插入吗?