bson数据通过BulkOperations批量入库mongo表报重复ID处理

bson数据批量入库mongo表报重复ID处理

一、需求

需要将一批bson格式数据批量入库指定mongo表,并且该表已存在数据,批量入库的数据可能和表中已有数据重复。

二、批量入库时的问题

采用MongoTemplate 原生的BulkOperations批量操作API upsert方法进行入库,报错:

Bulk write operation error on server localhost:27017. 
Write errors: [BulkWriteError{index=0, code=11000, 
message='E11000 duplicate key error collection

原因就是该表中已存在了当前写入的记录。

二、问题处理

对于用upsert接口批量写入的bson数据,如果有和原表中数据字段值全部一致的记录,则会报ID重复,这时可以通过更新一个无关紧要的字段,如更新日期,或者额外增加一个标记字段(数据入库完成后,直接批量更新掉),使得数据可以更新入库。修改的参考代码如下:

/**
* bson数据批量入库mongo表
* @param documentList bson格式数据列表
* @param colName      mongo 表名
*/
private void batchAdd2mongodb(List<Document> documentList, String colName) {
   if(CollectionUtils.isEmpty(documentList)) {
       return;
   }
   BulkOperations bulkOperations = mongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED, colName);
   List<Pair<Query, Update>> updatePairs = new ArrayList<>();
   Date date = new Date();
   for (Document doc : documentList) {
       Update update = Update.fromDocument(doc);
       // 除非记录库表中没有当前,则至少需要更新一个字段值,不然会报ID重复错误
       update.set("gxsj", date);
       Query query = new Query();
       query.addCriteria(Criteria.where("_id").is(doc.get("_id")));
       updatePairs.add(Pair.of(query, update));
   }
   bulkOperations.upsert(updatePairs);
   bulkOperations.execute();
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值