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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/450922.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【开题报告】基于微信小程序的校园资讯平台的设计与实现

1.选题背景与意义 随着移动互联网的快速发展&#xff0c;微信成为了人们日常生活中不可或缺的工具之一。在校园生活中&#xff0c;学生们对于校园资讯的获取和交流需求也越来越高。然而&#xff0c;传统的校园资讯发布方式存在信息不及时、传播范围有限等问题&#xff0c;无法…

三种Cache写入方式原理简介

三种Cache写入方式原理简介 在386以上档次的微机中&#xff0c;为了提高系统效率&#xff0c;普遍采用Cache&#xff08;高速缓冲存储器&#xff09;&#xff0c;现在的系统甚至可以拥有多级Cache。Cache实际上是位于CPU与DRAM主存储器之间少量超高速的静态存储器&#xff08;S…

Minor GC和Full GC

我们在日常开发中可能经常会听大家谈论GC&#xff0c;但是其实很多人对GC的种类其实并不是很了解&#xff0c;接下来我们简单介绍下Minor GC和Full GC及他们的区别。 MinorGC&#xff1a; 也可以叫作新生代GC&#xff0c;指的是发生在新生代的垃圾收集动作。因为新生代中对象大…

linux安装软件的几种方法

见&#xff1a;http://blog.csdn.net/u010509774/article/details/50593231 一、rpm包安装方式步骤&#xff1a; 1、找到相应的软件包&#xff0c;比如soft.version.rpm&#xff0c;下载到本机某个目录&#xff1b; 2、打开一个终端&#xff0c;su -成root用户&#xff1b; …

Android NDK MediaCodec在ijkplayer中的实践

https://www.jianshu.com/p/41d3147a5e07 从API 21&#xff08;Android 5.0&#xff09;开始Android提供C层的NDK MediaCodec的接口。 Java MediaCodec是对NDK MediaCodec的封装&#xff0c;ijkplayer硬解通路一直使用的是Java MediaCodec接Surface的方式。 本文的主要内容是&a…

leetcode-49-字母异位词分组(神奇的哈希)

题目描述&#xff1a; 给定一个字符串数组&#xff0c;将字母异位词组合在一起。字母异位词指字母相同&#xff0c;但排列不同的字符串。 示例: 输入: ["eat", "tea", "tan", "ate", "nat", "bat"], 输出: [[&quo…

【精心总结】java内存模型和多线程必会知识

内存模型 &#xff08;1&#xff09;java内存模型到底是个啥子东西&#xff1f; java内存模型是java虚拟机规范定义的一种特定模型&#xff0c;用以屏蔽不同硬件和操作系统的内存访问差异&#xff0c;让java在不同平台中能达到一致的内存访问效果&#xff0c;是在特定的协议下…

工作流 activity 视频教程 + redis 视频教程 百度网盘分享地址

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 云盘下载都没有密码&#xff0c;直接下载&#xff0c;解压有密码&#xff1a;chongxiangmengxiangjiaoyu&#xff0c; 解压完成后就可以…

快速解决 GRADLE 项目下载 gradle-*-all.zip 慢的问题

1、首先根据项目中 gradle\wrapper\gradle-wrapper.properties 文件的 distributionUrl 属性的值 #Tue Feb 06 12:27:20 CET 2018 distributionBaseGRADLE_USER_HOME distributionPathwrapper/dists zipStoreBaseGRADLE_USER_HOME zipStorePathwrapper/dists distributionUrlht…

[Python] 程序结构与控制流

1. 条件语句 if、else与elif语句用于控制条件代码的执行。条件语句的一般格式如下&#xff1a; if expression:statements elif expression:statements elif expression:statements ... else:statements 如果不需要执行任何操作&#xff0c;可以省略条件语句的else和elif子句。…

webrtc 源码结构

apiWebRTC 接口层。包括 DataChannel, MediaStream, SDP相关的接口。各浏览器都是通过该接口层调用的 WebRTC。call存放的是 WebRTC “呼叫&#xff08;Call&#xff09;” 相关逻辑层的代码。audio存放音频网络逻辑层相关的代码。音频数据逻辑上的发送&#xff0c;接收等代码。…

mysql查询流程解析及重要知识总结

时光荏苒啊&#xff01;在过两个月我就工作满三年了&#xff0c;大学毕业的情景还历历在目&#xff0c;而我已经默默的向油腻中年大叔进发了。作为一名苦逼的后端工程师&#xff0c;我搞过一段时间python&#xff0c;现在靠java糊口&#xff0c;但后来才发现&#xff0c;始终不…

界面无小事(八):RecyclerView增删item

界面无小事(一): RecyclerViewCardView了解一下 界面无小事(二): 让RecyclerView展示更多不同视图 界面无小事(三):用RecyclerView Toolbar做个文件选择器 界面无小事(四):来写个滚动选择器吧! 界面无小事(五):自定义TextView 界面无小事(六):来做个好看得侧拉菜单! 界面无小事…

Failed to install Tomcat7 service 解决

见&#xff1a; http://blog.csdn.net/desow/article/details/21446197 tomcat 安装时出现 Failed to install Tomcat7 service 今天在安装tomcat时提示 Failed to install Tomcat7 service了&#xff0c;花了大半天的时间找到了原因&#xff0c;下面分享给大家&#xff0c;希望…

保守官僚 诺基亚就这样迷失在智能机时代?

7月19日&#xff0c;诺基亚发布了二季度财报&#xff0c;净亏损达到了17亿美元&#xff0c;其中智能手机份额和销售量进一步下滑&#xff0c;这个智能手机的领导者&#xff0c;正在因智能手机而急速坠落。诺记亚领先业界近十年就把握住了智能手机的趋势&#xff0c;并推出了首款…

django集成ansibe实现自动化

动态生成主机列表和相关参数 def create_admin_domain(admin_node):workpath BASE_DIR /tools/ansible/scripthosts_file BASE_DIR /tools/ansible/host/ createhostfile()yml_file BASE_DIR /tools/ansible/yml/ create_admin_domain.ymldomain_path admin_node.doma…

extend 对象继承

function extend(o, n, override) {for (var p in n) {if (n.hasOwnProperty(p) && (!o.hasOwnProperty(p) || override))o[p] n[p];} }// 默认参数 var options {pageIndex: 1,pageTotal: 2 };// 新设置参数 var userOptions {pageIndex: 3,pageSize: 10 }extend(o…

【spring容器启动】之bean的实例化和初始化(文末附:spring循环依赖原理)

本次我们通过源码介绍ApplicationContext容器初始化流程&#xff0c;主要介绍容器内bean的实例化和初始化过程。ApplicationContext是Spring推出的先进Ioc容器&#xff0c;它继承了旧版本Ioc容器BeanFactory&#xff0c;并进一步扩展了容器的功能&#xff0c;增加了bean的自动识…

如何将自己的Java项目部署到外网

见&#xff1a;http://jingyan.baidu.com/article/90bc8fc864699af653640cf7.html 做b/s模式的web开发不同于c/s模式的客户端开发&#xff0c;c/s模式我们只要做好生成可执行文件发送给其他人&#xff0c;其他人就可以用了。但是c/s模式不同&#xff0c;在同一局域网下&#xf…

[Swift]LeetCode916.单词子集 | Word Subsets

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号&#xff1a;山青咏芝&#xff08;shanqingyongzhi&#xff09;➤博客园地址&#xff1a;山青咏芝&#xff08;https://www.cnblogs.com/strengthen/&#xff09;➤GitHub地址&a…