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



当我用新的 mongodb go 驱动程序插入一个集合中时,我会得到一个重复的例外,我可以在喷射它时看到。(mongo.WriteException)多个写入错误:

[{写错误:[{{e11000重复键错误集合: fhir.documents索引:enterprise_id_1 dup键:{:" cache-37",:" 102" }}]},{}]

我如何遇到内部错误,以编程知道它是一个重复的密钥,我可以处理它?

您为此救了我一个头痛。在您自己的答案上,我制作了一个辅助功能,可以使用错误模仿mgo.IsDup(),然后在写入器上循环以查找代码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迁移,而麻烦少一些。

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

"插入会话失败:多个写入错误:[{write错误:[{e11000重复键错误收集:test.users index: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

如今,在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实现。

最新更新