8

我正在为我的 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 异常的解析器可以帮助我检测异常的用途?

4

2 回答 2

7

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

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

于 2011-05-09T17:33:22.710 回答
3

使用 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

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

于 2015-07-24T02:50:44.423 回答