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

With mongodb-go-driver how do I get the inner exceptions

当我使用新的 MongoDB Go 驱动程序插入一个集合时,我得到一个重复的异常,我可以在输出它时看到它。 (mongo.WriteException) 多个写入错误:

[{write errors: [{E11000 duplicate key error collection: fhir.documents index: enterprise_id_1 dup key: { : "Cache-37", : "102" }}]}, {}]

如何找到内部错误以编程方式知道它是一个重复的密钥并且我可以处理它?

我终于知道怎么做了。获取基本错误代码应该简单得多! 给定一个错误,我检查发现的错误数量,目前只关心第一个错误。尽管最初的错误说有多个错误,但它只有一个。这实际上只是在寻找 Insert failures of duplicate 或 Find errors of not found。如果有更简单的方法,我想知道。在那之前,这就是我正在使用的,并且工作正常。顺便重复一下是11000.

"Insert with session failed: multiple write errors: [{write errors: [{E11000 duplicate key error collection: test.users index: roi_id_1 dup key: { : \"1\" }}]}, {}]\n"

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

你让我省去了这个麻烦。 根据您自己的回答,我制作了一个辅助函数,它使用 errors.As 模仿 mgo.IsDup() 并遍历 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 迁移时少一些麻烦。

现在 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-驱动程序实现。