springboot 整合 mongodb实现 批量更新数据
现需求:需要批量将1000个数据先查询在更新到mongodb(如果查询不到数据,则添加数据)
1:工具类BathUpdateOptions
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update; public class BathUpdateOptions { private Query query;
private Update update;
private boolean upsert = true;
private boolean multi = false; public Query getQuery() {
return query;
} public void setQuery(Query query) {
this.query = query;
} public Update getUpdate() {
return update;
} public void setUpdate(Update update) {
this.update = update;
} public boolean isUpsert() {
return upsert;
} public void setUpsert(boolean upsert) {
this.upsert = upsert;
} public boolean isMulti() {
return multi;
} public void setMulti(boolean multi) {
this.multi = multi;
} }
2:需要更新的domain
@Document(collection = "video_show_view")
public class VideoShowView {
//唯一值
private String id;
//节目id
private String cid;
//app播放次数
private String view;
//app虚拟播放次数
private String virtualViews;
//最后更新时间 时间戳
private String updateTime;
//get set ......
}
3:获取BathUpdateOptions 集合
/**
* @author xuyou
* @Package com.migu.live.mao
* @Description:
* @date 2018/6/11 16:13
*/
@Repository
public class VideoShowViewMao {
@Autowired
private MongoTemplate mongoTemplate; public BathUpdateOptions getBathUpdateOptions(VideoShowView videoShowView){
BathUpdateOptions options = new BathUpdateOptions();
Query query = new Query();
//查询条件
query.addCriteria(Criteria.where("cid").is(videoShowView.getCid()));
query.addCriteria(Criteria.where("types").is(videoShowView.getTypes()));
options.setQuery(query);
//mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
options.setMulti(true);
Update update = new Update();
//更新内容
update.set("view", videoShowView.getView());
update.set("updateTime", videoShowView.getUpdateTime());
options.setUpdate(update);
return options;
} public void bathUpdate(List<BathUpdateOptions> bups){
BathUpdateUtil.bathUpdate(mongoTemplate, VideoShowView.class, bups);
}
}
4:操作mongodb的工具类BathUpdateUtil
import java.util.ArrayList;
import java.util.List; import org.springframework.dao.InvalidDataAccessApiUsageException;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.mapping.Document; import com.migu.live.data.BathUpdateOptions;
import com.mongodb.BasicDBObject;
import com.mongodb.CommandResult;
import com.mongodb.DBCollection;
import com.mongodb.DBObject; public class BathUpdateUtil { /**
* @description:批量更新mongodb数据
* @author: xuyou
* @date: 2018年8月14日 上午11:28:29
*/
public static int bathUpdate(MongoTemplate mongoTemplate, Class<?> entityClass,
List<BathUpdateOptions> options) {
String collectionName = determineCollectionName(entityClass);
return doBathUpdate(mongoTemplate.getCollection(collectionName),
collectionName, options, true);
} private static String determineCollectionName(Class<?> entityClass) {
if (entityClass == null) {
throw new InvalidDataAccessApiUsageException(
"No class parameter provided, entity collection can't be determined!");
}
String collName = entityClass.getSimpleName();
if(entityClass.isAnnotationPresent(Document.class)) {
Document document = entityClass.getAnnotation(Document.class);
collName = document.collection();
} else {
collName = collName.replaceFirst(collName.substring(0, 1)
,collName.substring(0, 1).toLowerCase()) ;
}
return collName;
} private static int doBathUpdate(DBCollection dbCollection, String collName,
List<BathUpdateOptions> options, boolean ordered) {
DBObject command = new BasicDBObject();
command.put("update", collName);
List<BasicDBObject> updateList = new ArrayList<BasicDBObject>();
for (BathUpdateOptions option : options) {
BasicDBObject update = new BasicDBObject();
update.put("q", option.getQuery().getQueryObject());
update.put("u", option.getUpdate().getUpdateObject());
update.put("upsert", option.isUpsert());
update.put("multi", option.isMulti());
updateList.add(update);
}
command.put("updates", updateList);
command.put("ordered", ordered);
CommandResult commandResult = dbCollection.getDB().command(command);
return Integer.parseInt(commandResult.get("n").toString());
}
}
5:业务代码 可根据实际需求 进行修改
/**
* @description:执行更新
* @param liveKeys 需要更新的集合
* @return void
* @author: xuyou
* @date: 2018年8月14日 上午11:44:06
* @throws
*/
public void bathUpdateMongoDB (Set<String> liveKeys){
//将直播播放次数入mongoDB
List<BathUpdateOptions> bupsList = new ArrayList<BathUpdateOptions>();
for (String id : liveKeys) {
VideoShowView videoShowView = new VideoShowView();
//设置一些更新条件 此处省略
videoShowView.setUpdateTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
BathUpdateOptions options = videoShowViewMao.getBathUpdateOptions(videoShowView);
bupsList.add(options);
if(bupsList.size() >= 1000){
logger.info("bupsList : {}",bupsList.size());
videoShowViewMao.bathUpdate(bupsList);
bupsList = new ArrayList<BathUpdateOptions>();
}
}
//TODO 更新liveList剩余少于1000的数据
logger.info("bupsList : {}",bupsList.size());
if (bupsList != null && bupsList.size() > 0) {
videoShowViewMao.bathUpdate(bupsList);
}
}
6;pom文件
<!-- 对mongodb的支持 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
<version>2.0.2.RELEASE</version>
</dependency>
7:配置
spring.data.mongodb.uri=mongodb://10.200.85.97:27017,10.200.85.98:27017,10.200.85.99:27017/data_consumer
springboot 整合 mongodb实现 批量更新数据的更多相关文章
- MongoDB的批量查询条件进行批量更新数据
今天遇到这样一个场景:在Java中批量更新MongoDB数据,不过每次更新的条件有不一样,那如何有效地进行更新操作呢? 刚开始的时候,我是想到循环批量更新操作,即每一种查询条件进行一次批量更新过程,这 ...
- java操作mongodb & springboot整合mongodb
简单的研究原生API操作MongoDB以及封装的工具类操作,最后也会研究整合spring之后作为dao层的完整的操作. 1.原生的API操作 pom.xml <!-- https://mvnre ...
- SpringBoot 整合 MongoDB 实战介绍
一.介绍 在前面的文章中,我们详细的介绍了 MongoDB 的配置和使用,如果你对 MongoDB 还不是很了解,也没关系,在 MongoDB 中有三个比较重要的名词:数据库.集合.文档! 数据库(D ...
- Springboot整合MongoDB的Docker开发,其它应用也类似
1 前言 Docker是容器开发的事实标准,而Springboot是Java微服务常用框架,二者必然是会走到一起的.本文将讲解如何开发Springboot项目,把它做成Docker镜像,并运行起来. ...
- SpringBoot整合mongoDB
MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的. 这一片文章介绍一个springboot整合mongodb,如果你了解整合mysql之类的 ...
- SpringBoot 整合mongoDB并自定义连接池
SpringBoot 整合mongoDB并自定义连接池 得力于SpringBoot的特性,整合mongoDB是很容易的,我们整合mongoDB的目的就是想用它给我们提供的mongoTemplate,它 ...
- 8、SpringBoot整合之SpringBoot整合MongoDB
SpringBoot整合MongoDB 一.创建项目,选择依赖 仅选择Spring Web.Spring Data MongoDB即可 二.引入相关依赖(非必要) 这里只是为了实体类的创建方便而引入l ...
- Springboot 整合 MongoDB
Springboot 整合 MongoDB 这节我们将整合 Spring Boot 与 Mongo DB 实现增删改查的功能,并且实现序列递增. Mongo DB 的基本介绍和增删改查的用法可以参考我 ...
- 批量更新数据小心SQL触发器的陷阱
批量更新数据时候,Inserted和Deleted临时表也是批量的,但触发器只会调用执行一次!两个概念千万不要弄混淆! 错误的理解:例如:创建在A表上创建了一个Update触发器,里面写的是Updat ...
随机推荐
- ats显示代理缓存
如果要将ats用作显示代理缓存,则必须配置客户端软件(即浏览器)以将请求直接发送到ats. 如果没有将ats配置为使用透明度选项(通过交换机或路由器在路由到源服务器的情况下拦截客户端请求并重新路由到a ...
- Hyperledger Fabric网络节点架构
Fabric区块链网络的组成  区块链网络结构图 区块链网络组成 组成区块链网络相关的节点 节点是区块链的通信主体,和区块链网络相关的节点有多种类型:客户端(应用).Peer节点.排序服务(Orde ...
- Linux内核分析第十八章读书笔记
第十八章 调试 调试工作艰难是内核级开发区别于用户级开发的一个显著特点. 18.1 准备开始 我们需要什么? 一个bug 一个藏匿bug的内核版本 思路:假定能够让bug重现 在用户级程序中,bug直 ...
- LeetCode 88. 合并两个有序数组
题目: 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 的元素数量分别为 m ...
- python3 selenium打开Chrome报错闪退问题
ChromeDriver不匹配 Google Chrome 已是最新版本 版本 64.0.3282.186(正式版本) (32 位) ChromeDriver应该选择2.35 下载链接:https ...
- 在 IntelliJ IDEA 中配置 Spark(Java API) 运行环境
1. 新建Maven项目 初始Maven项目完成后,初始的配置(pom.xml)如下: 2. 配置Maven 向项目里新建Spark Core库 <?xml version="1.0& ...
- c++中队列queue和栈stack的基本操作
1.queue 模板类的定义在<queue>头文件中. 定义queue 对象的示例代码如下:queue<int> q1;queue<double> q2; queu ...
- PAT 甲级 1021 Deepest Root
https://pintia.cn/problem-sets/994805342720868352/problems/994805482919673856 A graph which is conne ...
- python基础教程1:入门基础知识
写在系列前,一点感悟 没有梳理总结的知识毫无价值,只有系统地认真梳理了才能形成自己的知识框架,否则总是陷入断片儿似的学习-遗忘循环中. 学习方法真的比刻苦"傻学"重要多了,而最重要 ...
- robotframework+Selenium2Library 模态窗口的处理
原文链接:https://www.cnblogs.com/zuola/p/5750018.html 所谓模态窗口,就是指除非采取有效的关闭手段,用户的鼠标焦点或者输入光标将一直停留在其上的对话框. ...