栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Go语言

go操作mongo,批量插入(insert many)唯一索引冲突问题

Go语言 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

go操作mongo,批量插入(insert many)唯一索引冲突问题

记录一下自己在使用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
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/908014.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号