最近,在调试代码中发现向MongoDB插入或者更新文档记录时若是多条的话都是采用for循环操作的,这样的处理方式会造成数据操作耗时,不符合批量处理的原则;对此,个人整理了一下有关MongoDB的批量更新和批量插入的操作流程,如下所示:

  1. @Autowired
  2. private MongoTemplate mongoTemplate;
  3. 1)批量插入示例如下:
  4. List<Object> insertDataList;
  5. BulkOperations operations = mongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED, collectionName);
  6. operations.insert(insertDataList);
  7. BulkWriteResult result = operations.execute();
  8. 2)批量修改示例如下:
  9. List<Object> updateDataList;
  10. BulkOperations operations = mongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED, collectionName);
  11. updateDateList.forEach(date -> {
  12. Query queryUpdate = new Query();
  13. queryUpdate.addCriteria(where("_id").is(value));
  14. Update update = new Update();
  15. update.set(field1, value1).set(field2, value2);
  16. operations.updateOne(queryUpdate, update);
  17. });
  18. BulkWriteResult result = operations.execute();
  19.  
  20. 3)利用BulkOperationsupsert方法可以同时支持插入和更新操作,示例如下:
  21. List<T> dataList = new ArrayList<>();
  22. List<Pair<Query, Update>> updateList = new ArrayList<>(dataList.size());
  23. BulkOperations operations = mongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED, collectionName);
  24. dataList.forEach(data -> {
  25. Query query = new Query(new
  26. Criteria(field1).is(value1)).addCriteria(new Criteria(field2).is(value2));
  27. Update update = new Update();
  28. for (int index = 0; index < dataList.size(); index++) {
  29. String key = data.getKey();
  30. String value = data.getValue();
  31.   update.set(key, value);
  32. }
  33. Pair<Query, Update> updatePair = Pair.of(query, update);
  34. updateList.add(updatePair);
  35. });
  36. operations.upsert(updateList);
  37. BulkWriteResult result = operations.execute();
  38.  
  39. 备注:BulkOperations.BulkMode.UNORDERED BulkOperations.BulkMode.ORDERED的区别:
  40. UNORDERED是平行处理,即使某条记录出错了,其余的也会继续处理;
  41.  
  42. ORDERED是队列排序处理,只要中途有个失败了,那么后续的操作流程就会终止了。
  43. enum BulkMode {
  44.  
  45. /** Perform bulk operations in sequence. The first error will cancel processing. */
  46. ORDERED,
  47.  
  48. /** Perform bulk operations in parallel. Processing will continue on errors. */
  49. UNORDERED
  50. };

MongoDB批量更新和批量插入的方式的更多相关文章

  1. Hibernate批量更新和批量删除批量添加(转)

    通常,在一个Session对象的缓存中只存放数量有限的持久化对象,等到Session对象处理事务完毕,还要关闭Session对象,从而及时释放Session的缓存占用的内存.批量处理数据是指在一个事务 ...

  2. mysql进阶(十四) 批量更新与批量更新多条记录的不同值实现方法

    mysql 批量更新与批量更新多条记录的不同值实现方法 在mysql中批量更新我们可能使用update,replace into来操作,下面详细介绍mysql批量更新与性能. 批量更新 mysql更新 ...

  3. mysql 批量更新和批量插入

    1. 批量更新 update table_name set field_name = CASE id WHEN id1 THEN  field_value, WHEN id1 THEN  field_ ...

  4. MySQL进行 批量插入,批量删除,批量更新,批量查询

    1.批量插入 ServiceImpl层 List<Person> addPeople = new ArrayList<>(); //addPeople存放多个Person对象 ...

  5. mysql 批量更新与批量更新多条记录的不同值实现方法

    批量更新 mysql更新语句很简单,更新一条数据的某个字段,一般这样写: 代码如下: UPDATE mytable SET myfield = 'value' WHERE other_field = ...

  6. LightSpeed的批量更新和批量删除

    1.Update对于批量操作 无论是Update还是Remove  都是使用LightSpeed的Query对象来完成. 注:Student是要进行Update的表(实体),StuName是表Stud ...

  7. 批量更新sql |批量update sql

    图所示现需要批量更新table2表内字段Pwd更新userName对IP地址username与Ip对应关系table1所示 update table2 set pwd=table1.ip from t ...

  8. mysql 批量更新与批量更新多条记录的不同值实现方法

    作者: 字体:[增加 减小] 类型:转载 时间:2013-10-02 我要评论 在mysql中批量更新我们可能使用update,replace into来操作,下面小编来给各位同学详细介绍mysql ...

  9. 【转】【MySql】Update批量更新与批量更新多条记录的不同值实现方法

    批量更新 mysql更新语句很简单,更新一条数据的某个字段,一般这样写: UPDATE mytable SET myfield = 'value' WHERE other_field = 'other ...

随机推荐

  1. margin合并及解决办法

    外边距合并指的是,当两个垂直外边距相遇时,它们将形成一个外边距. 合并后的外边距的高度等于两个发生合并的外边距的高度中的较大者 水平方向不会发生合并 只有普通文档流中块框的垂直外边距才会发生外边距合并 ...

  2. RabbitMQ配置死信队列

    死信队列 消息传输过程中难免会产生一些无法及时处理的消息,这些暂时无法处理的消息有时候也是需要被保留下来的,于是这些无法被及时处理的消息就变成了死信. 既然需要保留这些死信,那么就需要一个容器来存储它 ...

  3. Ansible学习笔记(一):部署管理Windows机器遇到的一些坑

    在给国盛通上海测试环境做Ansible管理Windows服务器的时候,遇到了一些坑,Google解决掉了,特此记录,坑用红色标记. 一.环境说明 1.Ansible管理主机 操作系统:CentOS 7 ...

  4. opencv —— findContours、drawContours 寻找并绘制轮廓

    轮廓图像与 Canny 图像的区别 一个轮廓一般对应一系列的点,也就是图像中的一条曲线.轮廓图像和 Canny 图像乍看起来表现几乎是一致的,但其实组成两者的数据结构差别很大: Canny 边缘图像是 ...

  5. 给test函数加个装饰器!

    import timedef timer(func): def deco(*args,**kwargs): start_time=time.time() func(*args,**kwargs) st ...

  6. The Ether 靶场

    0x01 首先对靶场进行端口扫描 发现只开启了80端口和22端口 0x02 目录扫描 访问了几个目录并没有什么发现 0x03 访问主页几个网站链接 发现了一个疑似文件包含的漏洞 0x04 抓包进行分析 ...

  7. NB-Iot和GPRS信号通信模式的对比

    NB-Iot和GPRS信号通信模式的对比

  8. 洛谷P1063能量项链(区间dp)

    题目描述: 给定一串序列x[],其中的每一个Xi看作看作一颗珠子,每个珠子包含两个参数,head和tail,前一颗的tail值是后一个的head值,珠子呈现环形(是一条项链),所以最后一颗的tail是 ...

  9. 一些linux软件国内源

    1. ubuntu 版本号 Ubuntu 12.04 (LTS)代号为precise. Ubuntu 14.04 (LTS)代号为trusty. Ubuntu 15.04 代号为vivid. Ubun ...

  10. SpringBoot 教程之 profile 的应用

    目录   区分环境的配置  区分环境的代码  激活 profile  示例源码  参考资料 一个应用为了在不同的环境下工作,常常会有不同的配置,代码逻辑处理.Spring Boot 对此提供了简便的支 ...