最近公司在做项目的时候用到mongo数据库 因为数据量比较大,所以需要优化的地方比较多,其中批量更新花了我很多的时间 特记录一下 备忘!
这里我用到spring-data-mongodb的版本是 2.0.7
spring的版本是5.0.7 这里需要注意下 spring 5才能和spring-data-mongodb 2兼容
还有个需要注意的地方是 spring5和log4j的2版本兼容 和1已经不兼容了
spring-data-mongodb 1版本在网上有很多的批量更新方法 我这里就不赘述了
废话不多说 上代码
首先获得组装List<UpdateManyModel<Document>>
@Override
public int batchUpdate(List<FrankPo> frankPos) throws IllegalAccessException {
UpdateOptions uo = new UpdateOptions();
uo.upsert(true);
List<UpdateManyModel<Document>> updates = new ArrayList<>();
for (FrankPo frankPo : frankPos) {
// 查询的条件 根据此条件查询需要更新的记录 比如{"id":1}
Document query = new Document(MAC ,frankPo.getMac());
Map<String, Object> objectMap = ObjectReflectionUtil.getObjectMap(frankPo);
// 更新语句 比如:{"name":"123"}
Document update = new Document();
for (Map.Entry<String, Object> entry : objectMap.entrySet()) {
update.put(entry.getKey(),entry.getValue());
}
// 这里update需要再次包装 包装后形成语句{"$set":{"name":"123"}} SystemConstant.MONGO_SET = "$set"
updates.add(new UpdateManyModel<Document>(query,new Document(SystemConstant.MONGO_SET,update),uo));
}
return super.batchUpdates(updates);
}
然后去dao执行sql
protected int batchUpdates(List<UpdateManyModel<Document>> updates){
logger.info("batchUpdates 参数--->" + JSONArray.toJSONString(updates) + " 集合名-->" + getCollectionName());
// 获得对应数据库的连接 getCollectionName()方法获取的是数据库中的集合名
MongoCollection<Document> collection = mongoTemplate.getCollection(getCollectionName());
// 这里返回的是被更新的记录的个数
return collection.bulkWrite(updates).getModifiedCount();
}
至此,批量更新也就结束了 其实这也就是我们自己去组装sql执行的方式
转载请注明出处!