MongoDB批量更新和批量插入的方式
在调试代码中发现向MongoDB插入或者更新文档记录时若是多条的话都是采用for循环操作的,这样的处理方式会造成数据操作耗时,不符合批量处理的原则;整理了一下有关MongoDB的批量更新和批量插入的操作流程
@Autowired
private MongoTemplate mongoTemplate;
(1)批量插入示例如下:
List<Object> insertDataList;
BulkOperations operations = mongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED, collectionName);
operations.insert(insertDataList);
BulkWriteResult result = operations.execute();
(2)批量修改示例如下:
List<Object> updateDataList;
BulkOperations operations = mongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED, collectionName);
updateDateList.forEach(date -> {
Query queryUpdate = new Query();
queryUpdate.addCriteria(where("_id").is(value));
Update update = new Update();
update.set(field1, value1).set(field2, value2);
operations.updateOne(queryUpdate, update);
});
BulkWriteResult result = operations.execute();
(3)利用BulkOperations的upsert方法可以同时支持插入和更新操作,示例如下:
List<T> dataList = new ArrayList<>();
List<Pair<Query, Update>> updateList = new ArrayList<>(dataList.size());
BulkOperations operations = mongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED, collectionName);
dataList.forEach(data -> {
Query query = new Query(new
Criteria(field1).is(value1)).addCriteria(new Criteria(field2).is(value2));
Update update = new Update();
for (int index = 0; index < dataList.size(); index++) {
String key = data.getKey();
String value = data.getValue();
update.set(key, value);
}
Pair<Query, Update> updatePair = Pair.of(query, update);
updateList.add(updatePair);
});
operations.upsert(updateList);
BulkWriteResult result = operations.execute();
备注:BulkOperations.BulkMode.UNORDERED 和 BulkOperations.BulkMode.ORDERED的区别:
UNORDERED是平行处理,即使某条记录出错了,其余的也会继续处理;
ORDERED是队列排序处理,只要中途有个失败了,那么后续的操作流程就会终止了。
enum BulkMode {
/** Perform bulk operations in sequence. The first error will cancel processing. */
ORDERED,
/** Perform bulk operations in parallel. Processing will continue on errors. */
UNORDERED
};
举例:
@Autowired
private MongoTemplate mongoTemplate;
@PostMapping("testMongo")
public String testMongo(){
long start=System.currentTimeMillis();
DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
//3.LocalDate发动,将字符串转换成 df格式的LocalDateTime对象,的功能
LocalDateTime startTime = LocalDateTime.parse("2020-01-01 00:00:01",df);
int oneNum=5000;
List<TestSearchAlarmInfo> insertDataList=new ArrayList(oneNum);
int totalnum=1200*10000;//1000万
for(int i=0;i<totalnum;i++){
TestSearchAlarmInfo info=new TestSearchAlarmInfo();
info.setMsgId(UUID.randomUUID().toString().replace("-",""));
if (i%2 == 0){
info.setAlgorithmCode("ZGTT-1000001");
info.setDeviceCode("10011001");
info.setDeviceName("zgtt设备");
info.setChannelCode("900001");
info.setChannelName("zgtt通道");
}else {
info.setAlgorithmCode("XWKJ-1000001");
info.setDeviceCode("20011001");
info.setDeviceName("xwkj设备");
info.setChannelCode("900002");
info.setChannelName("xwkj通道");
}
info.setTaskId(UUID.randomUUID().toString().replace("-",""));
info.setAlarmType(1000001);
String format = startTime.plusSeconds(i*10).format(df);
info.setAlarmTime(format);
info.setAlarmBody("烟火可见光");
info.setPan(1f);
info.setTilt(1f);
info.setZoom(1f);
info.setCreateTime(format);
info.setAlarmCode("yanhuo");
info.setAlarmArea("[{'area'}]");
info.setAlarmVideoUrl("videourl");
info.setAlarmPictureUrl("picurl");
info.setMsgType(0);
info.setImportanceLevel(1);
info.setNoticeResource(1);
Map<String, Object> map = new HashMap<>();
map.put("extra",i);
info.setExtraInfo(map);
insertDataList.add(info);
if(insertDataList.size()>=oneNum){
BulkOperations operations = mongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED,TestSearchAlarmInfo.class);
operations.insert(insertDataList);
operations.execute();
insertDataList=new ArrayList(oneNum);
}
}
if(!insertDataList.isEmpty()){
BulkOperations operations = mongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED,TestSearchAlarmInfo.class);
operations.insert(insertDataList);
operations.execute();
}
System.out.println("1000万用户用时:"+(System.currentTimeMillis()-start)+"毫秒");
return "结束";
}
本文作者:spiderMan1-1
本文链接:https://www.cnblogs.com/cgy1995/p/17944930
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
分类:
java知识点
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步