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 documentList, String colName) {
if(CollectionUtils.isEmpty(documentList)) {
return;
}
BulkOperations bulkOperations = mongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED, colName);
List> 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();
}