一、BulkOperations介绍
MongoDB 的
BulkOperations
允许在单个命令中执行多个写操作,这比逐一执行多个独立操作更高效。BulkOperations
可以用于插入、更新、删除和其他写操作。优点:
1、批量操作,减少服务器的通信次数,提升性能。
2、某个操作失败了,后续操作不在执行。
缺点:
1、批量操作更消耗内存,所有数据先集中起来,再统一操作,量超了,容易引起OOM
2、批量操作发生异常错误时,需要更复杂的逻辑来修复错误,因为批量数据量多
建议:
简单而确定的业务可以使用批量操作,最好是涉及单表的操作,失败了错误了不会对其它业务数据造很大影响。太过复杂场景和逻辑还是不建议使用
二、批量删除
批量删除,尽量使用主键删除
package com.ikscrm.scrm.order.manager;
import lombok.extern.slf4j.Slf4j;
import org.bson.types.ObjectId;
import org.springframework.data.mongodb.core.BulkOperations;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
@Component
@Slf4j
public class MongodbManager {
@Resource
private MongoTemplate mongoTemplate;
public void removeDataBacth(List<String> ids) {
if(ids.size()==0){
return;
}
List<Query> queryList = new ArrayList<>(ids.size());
BulkOperations operations = mongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED, "YOU_TABLE_NAME");
ids.forEach(id -> {
Query query = new Query(new Criteria("_id").is(new ObjectId(id)));
queryList.add(query);
});
operations.remove(queryList);
operations.execute();
}
}
三、批量插入
public void insertDataBacth(List<OrderDO> orderDOList) {
if(orderDOList.size()==0){
return;
}
BulkOperations operations = mongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED, "t_order_data");
orderDOList.forEach(orderDO -> {
operations.insert(orderDO);
});
operations.execute();
}
四、批量更新或插入
增加主键判断,如存在主键,会更新数据
public void saveDataBacth(List<OrderDO> orderDOList) {
if(orderDOList.size()==0){
return;
}
//更新或插入List
List<Pair<Query, Update>> updateList = new ArrayList<>(orderDOList.size());
//bulk operation
BulkOperations operations = mongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED, OrderDO.class);
//封装数据
orderDOList.forEach(data -> {
Query query = new Query(new Criteria("_id").is(data.getId()));
Update update;
Document doc = new Document();
mongoTemplate.getConverter().write(data, doc);
update = Update.fromDocument(new Document("$set", doc));
Pair<Query, Update> updatePair = Pair.of(query, update);
updateList.add(updatePair);
});
operations.upsert(updateList);
operations.execute();
}