7

当尝试在 mongo 中输入一个新文档时,在另一个文档中已经存在的字段上输入一个值时,当我遍历错误对象时,我得到了这个:

for(var att in err){
    console.log(att+": "+err[att]);
}

名称:MongoError 错误:E11000 重复键错误索引:draw.users.$email_1 重复键:{:“spam@online.no”} 代码:11000 n:0 ok:1

所以它告诉我我想知道什么,问题是电子邮件字段。但是我可以将违规字段作为键/值而不是字符串吗?

4

5 回答 5

5

以这种方式对返回的错误消息使用拆分对我有用

var x= err.errmsg.split("index:")[1].split("dup key")[0].split("_")[0];
于 2017-02-19T20:12:58.183 回答
4

我使用正则表达式。像这样

if(err){
   field = err.err.match(/\$(.*?)_/)[1]
}

这完全是hacky,但对我有用。

于 2013-11-10T15:14:38.583 回答
1

在新版本的 MongoDB 中,您也可以这样做。

wheredupField是重复的字段名称,err.keyValue[dupField]是重复的字段值。

const handleDuplicateFieldsDB = err => {
    const dupField = Object.keys(err.keyValue)[0];
    return `Duplicate field(${dupField}). Please use another value(${err.keyValue[dupField]})!`;
};
于 2020-03-16T22:33:59.307 回答
0

如果它发生碰撞,则为该查询创建一个 find() 将返回碰撞对象,然后您就可以从那里开始。

于 2013-07-09T12:17:16.493 回答
0

错误消息不会为您提供您正在寻找的信息:

名称:MongoError 错误:E11000 重复键错误索引:draw.users.$email_1 重复键:{:“spam@online.no”} 代码:11000 n:0 ok:1

但它给了你足够的检索它。

您需要获取导致问题的索引:“email_1”(使用正则表达式)

然后你需要向数据库询问这个索引:

draw.users.getIndexKey("email_1")

于 2016-01-12T20:24:46.570 回答