博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
springboot 整合 mongodb实现 批量更新数据
阅读量:6720 次
发布时间:2019-06-25

本文共 6748 字,大约阅读时间需要 22 分钟。

现需求:需要批量将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 */@Repositorypublic 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
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: xuyou19      * @date: 2018年8月14日 上午11:28:29 20      */21     public static int bathUpdate(MongoTemplate mongoTemplate, Class
entityClass, 22 List
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
options, boolean ordered) {46 DBObject command = new BasicDBObject();47 command.put("update", collName);48 List
updateList = new ArrayList
();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
liveKeys){10 //将直播播放次数入mongoDB11 List
bupsList = new ArrayList
();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
();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     
2
3
org.springframework.boot
4
spring-boot-starter-data-mongodb
5
2.0.2.RELEASE
6

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

你可能感兴趣的文章
Gearman及python客户端安装和简单试用
查看>>
何必那样拼命呢?能得到,得不到的,又怎样?!
查看>>
ubuntu 搜索域 访问域不成功的解决办法
查看>>
windows7下 python2.7 django1.62 安装
查看>>
Extjs改变行的的颜色
查看>>
Python爬虫--抓取百度贴吧图片
查看>>
java 自定义注解研究
查看>>
Linux MySQL 卸载后重新安装
查看>>
python打印所有汉字...
查看>>
cljr 安装失败记录
查看>>
hibernate注解方式
查看>>
log4j.properties 详解与配置步骤
查看>>
代码质量工具
查看>>
shell脚本之死循环写法
查看>>
06-Swift中的字符串
查看>>
java nio系列
查看>>
表结构关联原则
查看>>
自制裸眼3D图【推荐】
查看>>
天气预报现象mapping
查看>>
FFFF
查看>>