【问题标题】:Mongodb duplicate key error. How do i get the error field from the error object as object?Mongodb重复键错误。如何从错误对象中获取错误字段作为对象?
【发布时间】:2013-07-07 00:30:05
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: node.js mongodb


    【解决方案1】:

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

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

    const handleDuplicateFieldsDB = err => {
        const dupField = Object.keys(err.keyValue)[0];
        return `Duplicate field(${dupField}). Please use another value(${err.keyValue[dupField]})!`;
    };
    

    【讨论】:

      【解决方案2】:

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

      var x= err.errmsg.split("index:")[1].split("dup key")[0].split("_")[0];
      

      【讨论】:

      • 我添加了一个.trim(),因为我在索引名称前有一些空格
      【解决方案3】:

      错误消息没有提供您正在寻找的信息:

      name: MongoError err: E11000 duplicate key error index: draw.users.$email_1 dup key: { : "spam@online.no" } code: 11000 n: 0 ok: 1

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

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

      那么你需要向数据库询问这个索引:

      draw.users.getIndexKey("email_1")

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

        • 不适用于这样的复合索引:$client_1_email_1
        【解决方案5】:

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

        【讨论】:

        • 您只想对唯一的索引字段进行查找。这可能需要搜索多个字段。
        • 谢谢你们俩。我想我会在保存之前尝试 findOne 。以为我可以摆脱使用 mongoError 消息。我想这应该以某种方式是可能的?该消息告诉我我想要什么,但作为一个字符串,我猜在上面做一个正则表达式会很麻烦。
        • @ovind 更新仍有可能失败,因为在调用findOne 和插入/更新之间可以保存另一个文档。
        • 取决于你使用的库,有些会给出详细的错误,有些只是 1 或 0。我使用的是原生 mongo lib,但我认为没有比你的更详细。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多