现需求:需要批量将1000个数据先查询在更新到mongodb(如果查询不到数据,则添加数据)

1:工具类BathUpdateOptions

 1 import org.springframework.data.mongodb.core.query.Query;
 2 import org.springframework.data.mongodb.core.query.Update;
 3
 4 public class BathUpdateOptions {
 5
 6     private Query query;
 7     private Update update;
 8     private boolean upsert = true;
 9     private boolean multi = false;
10
11     public Query getQuery() {
12         return query;
13     }
14
15     public void setQuery(Query query) {
16         this.query = query;
17     }
18
19     public Update getUpdate() {
20         return update;
21     }
22
23     public void setUpdate(Update update) {
24         this.update = update;
25     }
26
27     public boolean isUpsert() {
28         return upsert;
29     }
30
31     public void setUpsert(boolean upsert) {
32         this.upsert = upsert;
33     }
34
35     public boolean isMulti() {
36         return multi;
37     }
38
39     public void setMulti(boolean multi) {
40         this.multi = multi;
41     }
42
43 }

2:需要更新的domain

 1 @Document(collection = "video_show_view")
 2 public class VideoShowView {
 3     //唯一值
 4     private String id;
 5     //节目id
 6     private String cid;
 7     //app播放次数
 8     private String view;
 9     //app虚拟播放次数
10     private String virtualViews;
11     //最后更新时间 时间戳
12     private String updateTime;
13   //get set ......
14 }

3:获取BathUpdateOptions 集合

/*** @author xuyou* @Package com.migu.live.mao* @Description:* @date 2018/6/11 16:13*/
@Repository
public class VideoShowViewMao {@Autowiredprivate 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

 1 import java.util.ArrayList;
 2 import java.util.List;
 3
 4 import org.springframework.dao.InvalidDataAccessApiUsageException;
 5 import org.springframework.data.mongodb.core.MongoTemplate;
 6 import org.springframework.data.mongodb.core.mapping.Document;
 7
 8 import com.migu.live.data.BathUpdateOptions;
 9 import com.mongodb.BasicDBObject;
10 import com.mongodb.CommandResult;
11 import com.mongodb.DBCollection;
12 import com.mongodb.DBObject;
13
14 public class BathUpdateUtil {
15
16     /**
17      * @description:批量更新mongodb数据
18      * @author: xuyou
19      * @date: 2018年8月14日 上午11:28:29
20      */
21     public static int bathUpdate(MongoTemplate mongoTemplate, Class<?> entityClass,
22         List<BathUpdateOptions> options) {
23         String collectionName = determineCollectionName(entityClass);
24         return doBathUpdate(mongoTemplate.getCollection(collectionName),
25              collectionName, options, true);
26     }
27
28     private static String determineCollectionName(Class<?> entityClass) {
29         if (entityClass == null) {
30             throw new InvalidDataAccessApiUsageException(
31                     "No class parameter provided, entity collection can't be determined!");
32         }
33         String collName = entityClass.getSimpleName();
34         if(entityClass.isAnnotationPresent(Document.class)) {
35             Document document = entityClass.getAnnotation(Document.class);
36             collName = document.collection();
37         } else {
38             collName = collName.replaceFirst(collName.substring(0, 1)
39                       ,collName.substring(0, 1).toLowerCase()) ;
40         }
41         return collName;
42     }
43
44     private static int doBathUpdate(DBCollection dbCollection, String collName,
45                        List<BathUpdateOptions> options, boolean ordered) {
46         DBObject command = new BasicDBObject();
47         command.put("update", collName);
48         List<BasicDBObject> updateList = new ArrayList<BasicDBObject>();
49         for (BathUpdateOptions option : options) {
50             BasicDBObject update = new BasicDBObject();
51             update.put("q", option.getQuery().getQueryObject());
52             update.put("u", option.getUpdate().getUpdateObject());
53             update.put("upsert", option.isUpsert());
54             update.put("multi", option.isMulti());
55             updateList.add(update);
56         }
57         command.put("updates", updateList);
58         command.put("ordered", ordered);
59         CommandResult commandResult = dbCollection.getDB().command(command);
60         return Integer.parseInt(commandResult.get("n").toString());
61     }
62 }

5:业务代码  可根据实际需求 进行修改

 1 /**
 2      * @description:执行更新
 3      * @param liveKeys 需要更新的集合
 4      * @return void
 5      * @author: xuyou
 6      * @date: 2018年8月14日 上午11:44:06
 7      * @throws
 8      */
 9     public void bathUpdateMongoDB (Set<String> liveKeys){
10         //将直播播放次数入mongoDB
11         List<BathUpdateOptions> bupsList = new ArrayList<BathUpdateOptions>();
12         for (String id : liveKeys) {
13             VideoShowView videoShowView = new VideoShowView();
14             //设置一些更新条件 此处省略
15             videoShowView.setUpdateTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
16             BathUpdateOptions options = videoShowViewMao.getBathUpdateOptions(videoShowView);
17             bupsList.add(options);
18             if(bupsList.size() >= 1000){
19                 logger.info("bupsList : {}",bupsList.size());
20                 videoShowViewMao.bathUpdate(bupsList);
21                 bupsList = new ArrayList<BathUpdateOptions>();
22             }
23         }
24         //TODO 更新liveList剩余少于1000的数据
25         logger.info("bupsList : {}",bupsList.size());
26         if (bupsList != null && bupsList.size() > 0) {
27             videoShowViewMao.bathUpdate(bupsList);
28         }
29     }

6;pom文件

1     <!-- 对mongodb的支持 -->
2         <dependency>
3             <groupId>org.springframework.boot</groupId>
4             <artifactId>spring-boot-starter-data-mongodb</artifactId>
5             <version>2.0.2.RELEASE</version>
6         </dependency>

7:配置

spring.data.mongodb.uri=mongodb://10.200.85.97:27017,10.200.85.98:27017,10.200.85.99:27017/data_consumer

转载于:https://www.cnblogs.com/xuyou551/p/9473713.html

springboot 整合 mongodb实现 批量更新数据相关推荐

  1. java mongodb批量更新数据_MongoDB的批量查询条件进行批量更新数据

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

  2. springboot批量更新实体_mybatis+mysql+springboot批量插入,批量更新数据

    在开发过程中都会遇到批量的插入或者是更新数据,本人只写了一下自己在做的过程中遇到问题,写此篇文章的作用:第一是记录自己在工作过程中的问题.第二是方便同行的伙伴们避免出现这样的问题消耗太多的时间.废话不 ...

  3. 直接裂开!京东二面被问SpringBoot整合MongoDB,我不会啊

    开始进入正题 一.技术介绍 SpringBoot整合MongoDB的实现步骤 一.技术介绍 1.MongoDB是什么? 二.使用步骤 1.MongoDB是什么? MongoDB(来自于英文单词&quo ...

  4. 【ReactJs+springBoot项目——租房】第6章:MongoDB入门+SpringBoot整合MongoDB+搭建微聊系统+实现微聊功能

    MongoDB入门 MongoDB的java api的使用 SpringBoot整合MongoDB使用 搭建微聊系统 实现微聊功能 分布式WebSocket解决方案分析 1.MongoDB入门 1.1 ...

  5. Spring-Boot 整合MongoDB

    Spring-Boot 整合MongoDB 一.引入MongoDB依赖 <dependency><groupId>org.springframework.boot</gr ...

  6. SpringBoot整合Mongodb(三) 使用MongoTemplate进行连表查询

    SpringBoot整合Mongodb(三) 使用MongoTemplate进行连表查询 由于在实际开发项目中,突然涉及到了需要Mongodb 进行连表操作的业务,所以我在私下进行了一波学习. 服务器 ...

  7. SpringBoot 整合mongoDB实现文章存储

    本项目展示了 SpringBoot 整合mongoDB进行文章存储,并实现简单增删改查,关于docker安装MongoDB:Docker 安装 MongoDB_Michael-DYZ的博客-CSDN博 ...

  8. SpringBoot整合MongoDB 及 基本使用

    目录 1.MongoDB基本介绍 2.MongoDB的特点 3.MongoDB的体系结构 4.MongoDB的数据类型 5.SpringBoot整合MongoDB ** 1.导入依赖 2.启动Mong ...

  9. SpringBoot整合MongoDB数据库并实现基础CRUD

    MongoDB安装教程:MongoDB数据库安装以及将MongoDB设置为系统服务 MongoDB简介 MongoDB是一个基于分布式文件存储的数据库,由C++语言编写.旨为WEB应用提供可扩展的高性 ...

最新文章

  1. 页面自动获取焦点影响页面切换效果_ReactIndex - 让文件夹index页面变得更有实用性 (替换传统Web服务器index页)...
  2. python查看和更改当前工作目录
  3. libopencv_core.so: file not recognized: File format not recognized
  4. 统计和生成所有不同的二叉树
  5. 希捷服务器硬盘savvio,2.5英寸进军万转!希捷Savvio硬盘评测
  6. apache lucene_Apache Lucene中的并发查询执行
  7. fcc认证_介绍fCC 100:我们对2019年杰出贡献者的年度总结
  8. Qt使用socket通信时接收的汉字信息显示时乱码
  9. ES6_对象简洁语法_note
  10. 《Android 源码设计模式解析与实战》— Android 书籍
  11. Xshell设置密钥登录CentOS6.5_64位(图文版)
  12. JMH在性能测试中的使用
  13. 废旧手机变成远程摄像头
  14. 北邮计算机考研多少分上岸,北京邮电大学考研分享:初试327分上岸,338分放弃复试!...
  15. Java代码关于TIFF/TIF图片转PNG
  16. 统计之 - 离均差平方和
  17. Window提高效率的软件
  18. 手机与计算机无线连接的方法,电脑和手机手动添加无线连接的方法
  19. 阿里开源工具——故障在线诊断Arthas
  20. WMI Backdoor

热门文章

  1. php session和cookie区别,php中session和cookie的区别是什么?
  2. Adobe网页无法访问服务器,Adobe Acrobat时提示“无法访问网络位置\startup”
  3. c3p0-config.xml
  4. 价钱转换python_如何在python中转换货币?
  5. 修改背景图片_我花了5小时,为网易修改了一份内容超多的PPT,效果超级赞!!...
  6. 基于注解的字段脱敏处理
  7. django 返回ajax html,Django 前台通过json 取出后台数据
  8. 炸窝(Collections当中的addAll方法)
  9. 判断非负整数是否是3的倍数_五年级数学因数与倍数知识点汇总与解题方法技巧...
  10. append在python里是什么意思_“一棵绿萝七个鬼”是什么意思?卧室里到底能不能养绿萝!...