springboot 整合 mongodb实现 批量更新数据
现需求:需要批量将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实现 批量更新数据相关推荐
- java mongodb批量更新数据_MongoDB的批量查询条件进行批量更新数据
今天遇到这样一个场景:在Java中批量更新MongoDB数据,不过每次更新的条件有不一样,那如何有效地进行更新操作呢? 刚开始的时候,我是想到循环批量更新操作,即每一种查询条件进行一次批量更新过程,这 ...
- springboot批量更新实体_mybatis+mysql+springboot批量插入,批量更新数据
在开发过程中都会遇到批量的插入或者是更新数据,本人只写了一下自己在做的过程中遇到问题,写此篇文章的作用:第一是记录自己在工作过程中的问题.第二是方便同行的伙伴们避免出现这样的问题消耗太多的时间.废话不 ...
- 直接裂开!京东二面被问SpringBoot整合MongoDB,我不会啊
开始进入正题 一.技术介绍 SpringBoot整合MongoDB的实现步骤 一.技术介绍 1.MongoDB是什么? 二.使用步骤 1.MongoDB是什么? MongoDB(来自于英文单词&quo ...
- 【ReactJs+springBoot项目——租房】第6章:MongoDB入门+SpringBoot整合MongoDB+搭建微聊系统+实现微聊功能
MongoDB入门 MongoDB的java api的使用 SpringBoot整合MongoDB使用 搭建微聊系统 实现微聊功能 分布式WebSocket解决方案分析 1.MongoDB入门 1.1 ...
- Spring-Boot 整合MongoDB
Spring-Boot 整合MongoDB 一.引入MongoDB依赖 <dependency><groupId>org.springframework.boot</gr ...
- SpringBoot整合Mongodb(三) 使用MongoTemplate进行连表查询
SpringBoot整合Mongodb(三) 使用MongoTemplate进行连表查询 由于在实际开发项目中,突然涉及到了需要Mongodb 进行连表操作的业务,所以我在私下进行了一波学习. 服务器 ...
- SpringBoot 整合mongoDB实现文章存储
本项目展示了 SpringBoot 整合mongoDB进行文章存储,并实现简单增删改查,关于docker安装MongoDB:Docker 安装 MongoDB_Michael-DYZ的博客-CSDN博 ...
- SpringBoot整合MongoDB 及 基本使用
目录 1.MongoDB基本介绍 2.MongoDB的特点 3.MongoDB的体系结构 4.MongoDB的数据类型 5.SpringBoot整合MongoDB ** 1.导入依赖 2.启动Mong ...
- SpringBoot整合MongoDB数据库并实现基础CRUD
MongoDB安装教程:MongoDB数据库安装以及将MongoDB设置为系统服务 MongoDB简介 MongoDB是一个基于分布式文件存储的数据库,由C++语言编写.旨为WEB应用提供可扩展的高性 ...
最新文章
- 页面自动获取焦点影响页面切换效果_ReactIndex - 让文件夹index页面变得更有实用性 (替换传统Web服务器index页)...
- python查看和更改当前工作目录
- libopencv_core.so: file not recognized: File format not recognized
- 统计和生成所有不同的二叉树
- 希捷服务器硬盘savvio,2.5英寸进军万转!希捷Savvio硬盘评测
- apache lucene_Apache Lucene中的并发查询执行
- fcc认证_介绍fCC 100:我们对2019年杰出贡献者的年度总结
- Qt使用socket通信时接收的汉字信息显示时乱码
- ES6_对象简洁语法_note
- 《Android 源码设计模式解析与实战》— Android 书籍
- Xshell设置密钥登录CentOS6.5_64位(图文版)
- JMH在性能测试中的使用
- 废旧手机变成远程摄像头
- 北邮计算机考研多少分上岸,北京邮电大学考研分享:初试327分上岸,338分放弃复试!...
- Java代码关于TIFF/TIF图片转PNG
- 统计之 - 离均差平方和
- Window提高效率的软件
- 手机与计算机无线连接的方法,电脑和手机手动添加无线连接的方法
- 阿里开源工具——故障在线诊断Arthas
- WMI Backdoor
热门文章
- php session和cookie区别,php中session和cookie的区别是什么?
- Adobe网页无法访问服务器,Adobe Acrobat时提示“无法访问网络位置\startup”
- c3p0-config.xml
- 价钱转换python_如何在python中转换货币?
- 修改背景图片_我花了5小时,为网易修改了一份内容超多的PPT,效果超级赞!!...
- 基于注解的字段脱敏处理
- django 返回ajax html,Django 前台通过json 取出后台数据
- 炸窝(Collections当中的addAll方法)
- 判断非负整数是否是3的倍数_五年级数学因数与倍数知识点汇总与解题方法技巧...
- append在python里是什么意思_“一棵绿萝七个鬼”是什么意思?卧室里到底能不能养绿萝!...