处理MongoDB异常的更好方法

时间:2011-05-09 16:24:50

标签: mongodb mongodb-.net-driver

我正在为我的asp.net应用程序开发MongoDB支持的身份验证模块。 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 })

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

2 个答案:

答案 0 :(得分:7)

我在MongoDB的bug跟踪器中创建了一个功能请求,以便在重复键错误时为getLastError的输出添加额外的字段。请在https://jira.mongodb.org/browse/SERVER-3069投票。

在实现之前,对于您的用例,您只需检查错误字符串是否包含“email”或“uname”,并从您尝试插入的文档中检索重复值。它并不像它可能那么优雅,但它现在应该有效。

答案 1 :(得分:1)

使用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,请参阅https://stackoverflow.com/a/30309874/516748

但是,如果您想确切地知道解析文本可能需要哪个重复键