现需求:需要批量将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. VGGNet论文翻译-Very Deep Convolutional Networks for Large-Scale Image Recognition

    Very Deep Convolutional Networks for Large-Scale Image Recognition Karen Simonyan[‡] & Andrew Zi ...

  2. PHPMyWind5.4存储XSS(CVE-2017-12984)

    0x0 环境 操作机:xp   192.168.110.128 目标:win2003    192.168.110.133 目标cms:PHPMyWind5.4 0x11 漏洞介绍 允许恶意访问者在客 ...

  3. 1093. Count PAT’s (25)-统计字符串中PAT出现的个数

    如题,统计PAT出现的个数,注意PAT不一定要相邻,看题目给的例子就知道了. num1代表目前为止P出现的个数,num12代表目前为止PA出现的个数,num123代表目前为止PAT出现的个数. 遇到P ...

  4. Daily Scrum NO.1

    工作概况 符美潇(PM): 今日工作 1.根据开发进程分配第一步开发工作,对相应的成员提出今日的开发要求:要求成员自己所负责的线程池,动态爬取,去重,文件分类等部分进行资料的相关了解. 2.Daily ...

  5. 2013337朱荟潼 Linux&深入理解计算机系统第七章读书笔记——链接

    第七章--链接 0.总结 链接编译时可以采用静态链接或动态链接. 连接器主要任务:符号解析和重定位. 多个目标文件可定义相同的符号,可以被连接到一个单独的静态库. 链接器可以生成部分链接的可执行文件 ...

  6. 编码用命令行执行的C语言词语统计程序

    需求介绍 程序处理用户需求的模式为: wc.exe [parameter][filename] 在[parameter]中,用户通过输入参数与程序交互,需实现的功能如下: 1.基本功能 支持 -c   ...

  7. WM_CONCAT和LISTAGG 语法例子

    select to_char(replace(wm_concat(name), ',', '')) from codeitems where setid = 'A018' and ' like cod ...

  8. SSR & Next.js & Nuxt.js

    SSR & Next.js & Nuxt.js Server Side Rendering https://nextjs.org/ https://nuxtjs.org/ SSR &a ...

  9. Java内置锁synchronized的实现原理

    简述Java中每个对象都可以用来实现一个同步的锁,这些锁被称为内置锁(Intrinsic Lock)或监视器锁(Monitor Lock). 具体表现形式如下: 1.普通同步方法,锁的是当前实例对象 ...

  10. IOS AES加密之ECB128模式

    1.AES加密模式有好几种,网上大多是CBC.256模式,找了好久才找到解决ECB128模式加密. AES需要导入头文件 #import <CommonCrypto/CommonCryptor. ...