现需求:需要批量将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实现 批量更新数据的更多相关文章

  1. MongoDB的批量查询条件进行批量更新数据

    今天遇到这样一个场景:在Java中批量更新MongoDB数据,不过每次更新的条件有不一样,那如何有效地进行更新操作呢? 刚开始的时候,我是想到循环批量更新操作,即每一种查询条件进行一次批量更新过程,这 ...

  2. java操作mongodb & springboot整合mongodb

    简单的研究原生API操作MongoDB以及封装的工具类操作,最后也会研究整合spring之后作为dao层的完整的操作. 1.原生的API操作 pom.xml <!-- https://mvnre ...

  3. SpringBoot 整合 MongoDB 实战介绍

    一.介绍 在前面的文章中,我们详细的介绍了 MongoDB 的配置和使用,如果你对 MongoDB 还不是很了解,也没关系,在 MongoDB 中有三个比较重要的名词:数据库.集合.文档! 数据库(D ...

  4. Springboot整合MongoDB的Docker开发,其它应用也类似

    1 前言 Docker是容器开发的事实标准,而Springboot是Java微服务常用框架,二者必然是会走到一起的.本文将讲解如何开发Springboot项目,把它做成Docker镜像,并运行起来. ...

  5. SpringBoot整合mongoDB

    MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的. 这一片文章介绍一个springboot整合mongodb,如果你了解整合mysql之类的 ...

  6. SpringBoot 整合mongoDB并自定义连接池

    SpringBoot 整合mongoDB并自定义连接池 得力于SpringBoot的特性,整合mongoDB是很容易的,我们整合mongoDB的目的就是想用它给我们提供的mongoTemplate,它 ...

  7. 8、SpringBoot整合之SpringBoot整合MongoDB

    SpringBoot整合MongoDB 一.创建项目,选择依赖 仅选择Spring Web.Spring Data MongoDB即可 二.引入相关依赖(非必要) 这里只是为了实体类的创建方便而引入l ...

  8. Springboot 整合 MongoDB

    Springboot 整合 MongoDB 这节我们将整合 Spring Boot 与 Mongo DB 实现增删改查的功能,并且实现序列递增. Mongo DB 的基本介绍和增删改查的用法可以参考我 ...

  9. 批量更新数据小心SQL触发器的陷阱

    批量更新数据时候,Inserted和Deleted临时表也是批量的,但触发器只会调用执行一次!两个概念千万不要弄混淆! 错误的理解:例如:创建在A表上创建了一个Update触发器,里面写的是Updat ...

随机推荐

  1. 【机器学习】Apriori算法——原理及代码实现(Python版)

    Apriopri算法 Apriori算法在数据挖掘中应用较为广泛,常用来挖掘属性与结果之间的相关程度.对于这种寻找数据内部关联关系的做法,我们称之为:关联分析或者关联规则学习.而Apriori算法就是 ...

  2. python 安装多个包/pip用法

    列出已安装的包 pip freeze or pip list 导出requirements.txt pip freeze > <目录>/requirements.txt 安装包 在线 ...

  3. 带状态论文粗读(三)[引用openstate的相关论文阅读]

    一 文章名称:FLOWGUARD: Building Robust Firewalls for Software-Defined Networks 发表时间:2014 期刊来源:--- 解决问题: 一 ...

  4. 第二个spring冲刺第6天

    今天的进展不多,对代码重新进行了整合,看起了比较简洁

  5. "Gun N' Rose" Team学习心得

    如果我比别人看得更远,只因为我站在巨人的肩膀上.                                                        ——牛顿 高级软件工程课程终于开课了!第 ...

  6. vs2013的安装及测试(第三周)

    1.打开同学给的安装包,发现如下问题: 2.因为是win7,提示需安装IE10.因为安装IE10必须要在安装好 server pack 1的情况下,所以从官方网站上下载好server pack 1,并 ...

  7. redis集群的测试

    原文:http://blog.sina.com.cn/s/blog_53b45c4d0102wg10.html 1.测试存取值 客户端连接集群redis-cli需要带上 -c ,redis-cli - ...

  8. [财务知识]IFRS9

    浅谈IFRS9 2018-07-10 23:15信用/收益 原创申明 本文原创作者为金融监管研究院助理研究员李健,未经授权谢绝转载.引用.抄袭. 引言 2018年6月6日,财政部会计司发布了“关于就& ...

  9. Java == ,equals 和 hashcode 的区别和联系(阿里面试)

    今天阿里的人问我 equals 与hashcode的区别,我答不上来, 仔细查了一下,做了总结: (1) == 这是Java 比较内存地址,就是内存中的对象: java中的==是比较两个对象在JVM中 ...

  10. 一本通1639Biorhythms

    1639:Biorhythms 时间限制: 1000 ms         内存限制: 524288 KB [题目描述] 原题来自:POJ 1006 人生来就有三个生理周期,分别为体力.感情和智力周期 ...