当我使用新的MongoDB Go驱动程序插入集合时,我得到一个重复的异常,我可以在喷出它时看到它。 (mongo.WriteException)
多个写入错误:
[{写入错误:[{E11000 重复键错误集合:fhir.documents 索引:enterprise_id_1 重复键:{:“Cache-37”,:“102”}}]},{}]
我如何才能以编程方式知道它是一个重复的键并且我可以处理它?
当我使用新的MongoDB Go驱动程序插入集合时,我得到一个重复的异常,我可以在喷出它时看到它。 (mongo.WriteException)
多个写入错误:
[{写入错误:[{E11000 重复键错误集合:fhir.documents 索引:enterprise_id_1 重复键:{:“Cache-37”,:“102”}}]},{}]
我如何才能以编程方式知道它是一个重复的键并且我可以处理它?
你用这个让我头疼。在您自己的答案的基础上,我创建了一个辅助函数,它模仿mgo.IsDup()
使用 errors.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 迁移而少一点麻烦。
我终于知道如何了。获取基本错误代码应该要简单得多!给定一个错误,我检查发现的错误数量,目前只关心第一个。即使最初的错误说有多个错误,它也只有一个。这实际上只是寻找重复的插入失败或未找到的查找错误。如果有更简单的方法,我想知道。在那之前,这就是我正在使用的,它工作正常。顺便说一下,重复是11000。
“插入会话失败:多个写入错误:[{写入错误:[{E11000 重复键错误集合:test.users 索引:roi_id_1 重复键:{:\“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 实现。