使用mongodb-go-driver如何获取内部异常

时间:2019-07-06 19:14:35

标签: mongo-go

当我使用新的 MongoDB Go 驱动程序插入集合时,会出现重复异常,喷出时可以看到。 (mongo.WriteException)多次写入错误:

  

[{写错误:[{E11000重复键错误集合:   fhir.documents索引:enterprise_id_1 dup键:{:“ Cache-37”,:“ 102”   }}]},{}]

如何通过编程方式知道该内部错误是重复的密钥,并且可以处理?

3 个答案:

答案 0 :(得分:7)

您为此省去了我的头痛。 根据您自己的答案,我创建了一个辅助函数,该函数使用错误模拟mgo.IsDup()。As并遍历WriteErrors以查找代码11000。

func IsDup(err error) bool {
    var e mongo.WriteException
    if errors.As(err, &e) {
        for _, we := range e.WriteErrors {
            if we.Code == 11000 {
                return true
            }
        }
    }
    return false
}

我的数据库包中有它,所以我可以打电话给db.IsDup(err)

我想如果需要的话,我将抽象循环以检查更多的错误代码,但是至少这样,我可以以较少的麻烦从mgo进行迁移。

答案 1 :(得分:0)

我终于发现了。获取基本错误代码应该更简单! 给定错误,我检查发现的错误数量,目前仅关心第一个错误。即使初始错误表示多个错误,也只有一个。这实际上只是在寻找重复的插入失败或未找到的查找错误。如果有更简单的方法,我想知道。在此之前,这就是我正在使用的,并且工作正常。重复是11000。

“插入会话失败:多次写入错误:[{写入错误:[{E11000重复密钥错误集合:test.users索引:roi_id_1 dup密钥:{:\” 1 \“}}]}},{} \ n“

        var merr mongo.WriteException
        merr = err.(mongo.WriteException)
        log.Errorf("Number of errors: %d", len(merr.WriteErrors))
        errCode := merr.WriteErrors[0].Code

答案 2 :(得分:0)

如今在 mongo-driver@v1.5.2 中,我们在 mongo/errors.go 中定义了以下函数:

// IsDuplicateKeyError returns true if err is a duplicate key error
func IsDuplicateKeyError(err error) bool {
    // handles SERVER-7164 and SERVER-11493
    for ; err != nil; err = unwrap(err) {
        if e, ok := err.(ServerError); ok {
            return e.HasErrorCode(11000) || e.HasErrorCode(11001) || e.HasErrorCode(12582) ||
                e.HasErrorCodeWithMessage(16460, " E11000 ")
        }
    }
    return false
}

所以我们可以依赖 mongo-driver 实现。