最近有一个需求,需要从一个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));}
}

注意: 这里对原作者的代码进行了修改【联系到了原作者,原作者给出的方法】:

  1. 将DBObjec类型的command转换为了Bson
  2. 执行命令的函数改为了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批量更新相关推荐

  1. SpringBoot+Mybatis+Druid批量更新 multi-statement not allow异常

    SpringBoot+Mybatis+Druid批量更新 multi-statement not allow异常 参考文章: (1)SpringBoot+Mybatis+Druid批量更新 multi ...

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

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

  3. Mongodb 批量更新

    此处讲两个关于在开发过程中,可能遇到或需要注意的问题. 很重要,需要注意!!! 1.在修改本地实体类名时,需要注意也需要修改表字段_class指向的类路径 2. 涉及到批量修改,有两种方式,各位大神们 ...

  4. java mongodb 批量更新_MongoDB批量更新和批量插入的方式

    @AutowiredprivateMongoTemplate mongoTemplate; (1)批量插入示例如下: ListinsertDataList; BulkOperations operat ...

  5. java mongodb批量更新_java中mongoTemplate批量更新

    方法:mongoTemplate.getDb().getCollection(tableName).bulkWrite(requests); public BulkWriteResult bulkWr ...

  6. mysql 批量update sql_批量更新sql |批量update sql

    zencart批量更新后台邮箱地址sql zencart批量更新后台邮箱地址sql UPDATE `configuration` SET `configuration_value` = '新邮箱地址' ...

  7. springboot 整合 mongodb实现 批量更新数据

    现需求:需要批量将1000个数据先查询在更新到mongodb(如果查询不到数据,则添加数据) 1:工具类BathUpdateOptions 1 import org.springframework.d ...

  8. MongoDB数据库批量更新

    @MongoDB数据库批量更新 MongoDB数据库批量更新 例子: db.表名.find().forEach(function(item){ db.表名.update({"要更新的字段名& ...

  9. MongoDB中的子文档批量更新

    Mongodb 3.6版本的福利好吧! 谢谢观看,转载请标注来源Thanks!©PerfumerKarma 官网文档地址: https://docs.mongodb.com/manual/refere ...

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

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

最新文章

  1. 用“找回iPhone”的方法追踪新冠接触者,MIT谷歌苹果开发蓝牙新冠传播追踪系统...
  2. Windows Azure真实案例:微软IT-将拍卖工具搬移至云端,方便雇员捐赠
  3. 全国计算机等级考试三级历年真题,历年全国计算机等级考试三级(数据库技术)笔试选择真题...
  4. struts2关键配置及函数总结,
  5. ASP.NET AJAX 首部曲 - 迈向解密之路
  6. 博客园url跳转导致xss
  7. ffmpeg + rtp介绍
  8. Shell nohup 命令详解
  9. Spurious Wakup
  10. java 实现 excel 去重,excel实现筛选去重操作
  11. 推箱子c语言代码有注释,C语言代码实现推箱子小游戏
  12. 上标和下标复制大全(含0~9、字母、特殊字符)
  13. 玩转微信|两种微信批量删除好友教程
  14. 小程序新生英语短剧大赛投票系统
  15. answer的汉语_answer是什么意思中文翻译(answer中文意思及应用)
  16. 散装食品的经营之道,从哪方面入手?
  17. STM8L探索套件学习笔记-EXTI外部中断
  18. excel分类_excel分类汇总
  19. 有限域的构造之常见本原多项式
  20. 被骗了,自己还不知道

热门文章

  1. 纯干货:深度学习实现之空间变换网络-part2
  2. 如何更好的优化MySQL数据库
  3. Spring(16)——使用注解进行bean定义
  4. Python 之 向上取整、向下取整以及四舍五入函数
  5. PHP-利用GD库新建图像
  6. 获取GridView控件总列数
  7. python 学习笔记 while语句(11)
  8. 如何在macOS Monterey 中开启对焦模式?
  9. Blocs 4 for Mac(可视化网页设计工具)
  10. Navicat提示“failed to save password error code”的解决办法