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
原因就是该表中已存在了当前写入的记录。
二、问题处理
对批量写入的数据,更新一个无关紧要的字段,如更新日期,或者额外增加一个标记字段(数据入库完成后,直接批量更新掉)。修改的参考代码如下:
/**
* 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();
}