记录一下自己在使用go调用mongo的时候,批量插入insert many的时候遇到的唯一索引冲突问题,对go和mongo的官方驱动包不做过多阐述
问题简述:
go语言操作mongo要用到官方的工具包:"go.mongodb.org/mongo-driver/mongo"
其中有个批量插入的方法 InsertMany
批量插入会遇到一个问题(尤其是再分页批量插入的时候,我设置的批量上限是2000条):唯一健索引冲突导致后续的插入失败
需求:
希望批量插入的时候能忽略唯一索引冲突的元素,并保证其他的元素正常插入
解决办法:
思路:
1.设置批量插入的条件ordered=false:保证某一次批量插入的时候,一个失败了,这次批量插入的其他数据能正常被插入。
2.判断返回的err是不是唯一健冲突,如果是的话,忽略该err
首先进行条件插入要用到官方包:
"go.mongodb.org/mongo-driver/mongo/options"
代码demo如下:
_,e:=mgdbClient.DB().Collection(表名).InsertMany(context, 数据集,options.InsertMany().SetOrdered(false))
//判断e是不是mongo的异常
if mgErr, ok := e.(mongo.BulkWriteException); ok {
//判断该mongo异常是不是内容异常
if mgErr.WriteConcernError != nil {
log.Errorc(ctx, "mgErr.WriteConcernError err(%v)", mgErr)
return
}
//遍历写入异常
for _, writeErr := range mgErr.WriteErrors {
//1100是唯一索引冲突的错误码
if writeErr.Code != 11000 {
log.Errorc(ctx, "mgErr.WriteErrors err(%v)", mgErr)
return
}
}
log.Warnc(ctx, "mgErr.WriteErrors uk repeat err(%v)", mgErr)
e = nil
return
}



