SpringBoot作mongodb批量更新
最近有一个需求,需要从一个MongoDB操作日志表中取出所有对mongo集合的处理,然后执行操作。简单来说就是找到之前所有用户的操作,然后在一张空白集合中再次演绎一遍。因为这些操作基本都不相同即每次修改都是不一样的,所以从效率上考虑采用批量更新的方法。
参考文章:https://www.jianshu.com/p/3577ccb722a1
原文对批量更新的讲述比较细。由于讲述的是mongo2.0.0之前版本,而我使用的是2.1.5,故而实施过程中会出现了一些版本兼容问题:
mongoTemplate.getCollection()返回的类型由之前的 DBCollection 变成了 MongoCollection
下面给出修改后的核心代码(如有兴趣可参考尹吉欢文章 https://www.jianshu.com/p/3577ccb722a1 )。
1. 定义一个[封装更新与查询]工具类
public class BatchUpdateOptions {private Query query;private Update update;private boolean upsert = false;private boolean multi = false;
}
2. 封装一个Mongo数据访问基础对象
public class MongoBaseDao {/*** 批量更新* @param ordered 如果为true,一条语句更新失败,剩下的语句将不再执。如果为false,一条语句更新失败,剩下的将继续执行。默认为true。* @return*/public static int batchUpdate(MongoTemplate mongoTemplate, String collectionName, List<BatchUpdateOptions> options, boolean ordered) {return doBatchUpdate(mongoTemplate, collectionName, options, ordered);}private static int doBatchUpdate(MongoTemplate mongoTemplate, String collName, List<BatchUpdateOptions> options, boolean ordered) {DBObject command = new BasicDBObject();command.put("update", collName);List<BasicDBObject> updateList = new ArrayList<BasicDBObject>();for (BatchUpdateOptions 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);Document document = mongoTemplate.getDb().runCommand((Bson) command);System.out.println("doc:"+document);System.out.println("doc--n:"+document.get("n"));System.out.println("doc--nModified:"+document.get("nModified"));// n为符合Query查询的记录总数 因为是根据id进行的查询, 原则上只要符合查询的记录数等于要更新的数量就代表成功Object n = document.get("n");System.out.println("doc--n--class:"+n.getClass());if(n.getClass()==Integer.class){return (Integer)n;}return Integer.parseInt(String.valueOf(n));}
}
注意: 这里对原作者的代码进行了修改【联系到了原作者,原作者给出的方法】:
- 将DBObjec类型的command转换为了Bson。
- 执行命令的函数改为了mongoTemplate.getDb().runCommand()
mongo官方手册给出的更新命令的说明:
https://docs.mongodb.com/manual/reference/command/update/
3. 调用实例
List<BatchUpdateOptions> list = new ArrayList<BatchUpdateOptions>();// 注意upsert置为false, 更新过程不做插入for (Map map : aus) {Update update = new Update();for (Object k : map.keySet()) {update.set(String.valueOf(k), map.get(k));}Query query = Query.query(Criteria.where(primaryKey).is(map.get("id")));BatchUpdateOptions options = new BatchUpdateOptions(query, update, false, true);list.add(options);}int n = MongoBaseDao.batchUpdate(mongoTemplate, collectionName, list, true);boolean res = (n == aus.size());
aus为封装的所有对mongo进行更新的集合。
SpringBoot作mongodb批量更新相关推荐
- SpringBoot+Mybatis+Druid批量更新 multi-statement not allow异常
SpringBoot+Mybatis+Druid批量更新 multi-statement not allow异常 参考文章: (1)SpringBoot+Mybatis+Druid批量更新 multi ...
- java mongodb批量更新数据_MongoDB的批量查询条件进行批量更新数据
今天遇到这样一个场景:在Java中批量更新MongoDB数据,不过每次更新的条件有不一样,那如何有效地进行更新操作呢? 刚开始的时候,我是想到循环批量更新操作,即每一种查询条件进行一次批量更新过程,这 ...
- Mongodb 批量更新
此处讲两个关于在开发过程中,可能遇到或需要注意的问题. 很重要,需要注意!!! 1.在修改本地实体类名时,需要注意也需要修改表字段_class指向的类路径 2. 涉及到批量修改,有两种方式,各位大神们 ...
- java mongodb 批量更新_MongoDB批量更新和批量插入的方式
@AutowiredprivateMongoTemplate mongoTemplate; (1)批量插入示例如下: ListinsertDataList; BulkOperations operat ...
- java mongodb批量更新_java中mongoTemplate批量更新
方法:mongoTemplate.getDb().getCollection(tableName).bulkWrite(requests); public BulkWriteResult bulkWr ...
- mysql 批量update sql_批量更新sql |批量update sql
zencart批量更新后台邮箱地址sql zencart批量更新后台邮箱地址sql UPDATE `configuration` SET `configuration_value` = '新邮箱地址' ...
- springboot 整合 mongodb实现 批量更新数据
现需求:需要批量将1000个数据先查询在更新到mongodb(如果查询不到数据,则添加数据) 1:工具类BathUpdateOptions 1 import org.springframework.d ...
- MongoDB数据库批量更新
@MongoDB数据库批量更新 MongoDB数据库批量更新 例子: db.表名.find().forEach(function(item){ db.表名.update({"要更新的字段名& ...
- MongoDB中的子文档批量更新
Mongodb 3.6版本的福利好吧! 谢谢观看,转载请标注来源Thanks!©PerfumerKarma 官网文档地址: https://docs.mongodb.com/manual/refere ...
- springboot批量更新实体_mybatis+mysql+springboot批量插入,批量更新数据
在开发过程中都会遇到批量的插入或者是更新数据,本人只写了一下自己在做的过程中遇到问题,写此篇文章的作用:第一是记录自己在工作过程中的问题.第二是方便同行的伙伴们避免出现这样的问题消耗太多的时间.废话不 ...
最新文章
- 用“找回iPhone”的方法追踪新冠接触者,MIT谷歌苹果开发蓝牙新冠传播追踪系统...
- Windows Azure真实案例:微软IT-将拍卖工具搬移至云端,方便雇员捐赠
- 全国计算机等级考试三级历年真题,历年全国计算机等级考试三级(数据库技术)笔试选择真题...
- struts2关键配置及函数总结,
- ASP.NET AJAX 首部曲 - 迈向解密之路
- 博客园url跳转导致xss
- ffmpeg + rtp介绍
- Shell nohup 命令详解
- Spurious Wakup
- java 实现 excel 去重,excel实现筛选去重操作
- 推箱子c语言代码有注释,C语言代码实现推箱子小游戏
- 上标和下标复制大全(含0~9、字母、特殊字符)
- 玩转微信|两种微信批量删除好友教程
- 小程序新生英语短剧大赛投票系统
- answer的汉语_answer是什么意思中文翻译(answer中文意思及应用)
- 散装食品的经营之道,从哪方面入手?
- STM8L探索套件学习笔记-EXTI外部中断
- excel分类_excel分类汇总
- 有限域的构造之常见本原多项式
- 被骗了,自己还不知道