当前位置: 首页 > news >正文

JAVA Mongodb 深入学习(一)BulkOperations 批量操作

一、BulkOperations介绍

MongoDB 的 BulkOperations 允许在单个命令中执行多个写操作,这比逐一执行多个独立操作更高效。BulkOperations 可以用于插入、更新、删除和其他写操作。

优点:

1、批量操作,减少服务器的通信次数,提升性能。

2、某个操作失败了,后续操作不在执行。

缺点:

1、批量操作更消耗内存,所有数据先集中起来,再统一操作,量超了,容易引起OOM

2、批量操作发生异常错误时,需要更复杂的逻辑来修复错误,因为批量数据量多

建议:

简单而确定的业务可以使用批量操作,最好是涉及单表的操作,失败了错误了不会对其它业务数据造很大影响。太过复杂场景和逻辑还是不建议使用

二、批量删除

批量删除,尽量使用主键删除

package com.ikscrm.scrm.order.manager;import lombok.extern.slf4j.Slf4j;
import org.bson.types.ObjectId;
import org.springframework.data.mongodb.core.BulkOperations;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Component;import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;@Component
@Slf4j
public class MongodbManager {@Resourceprivate MongoTemplate mongoTemplate;public void removeDataBacth(List<String> ids) {if(ids.size()==0){return;}List<Query> queryList = new ArrayList<>(ids.size());BulkOperations operations = mongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED, "YOU_TABLE_NAME");ids.forEach(id -> {Query query = new Query(new Criteria("_id").is(new ObjectId(id)));queryList.add(query);});operations.remove(queryList);operations.execute();}
}

三、批量插入

    public void insertDataBacth(List<OrderDO> orderDOList) {if(orderDOList.size()==0){return;}BulkOperations operations = mongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED, "t_order_data");orderDOList.forEach(orderDO -> {operations.insert(orderDO);});operations.execute();}

四、批量更新或插入

增加主键判断,如存在主键,会更新数据

    public void saveDataBacth(List<OrderDO> orderDOList) {if(orderDOList.size()==0){return;}//更新或插入ListList<Pair<Query, Update>> updateList = new ArrayList<>(orderDOList.size());//bulk operationBulkOperations operations = mongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED, OrderDO.class);//封装数据orderDOList.forEach(data -> {Query query = new Query(new Criteria("_id").is(data.getId()));Update update;Document doc = new Document();mongoTemplate.getConverter().write(data, doc);update = Update.fromDocument(new Document("$set", doc));Pair<Query, Update> updatePair = Pair.of(query, update);updateList.add(updatePair);});operations.upsert(updateList);operations.execute();}

相关文章:

  • k8s学习--负载均衡器matelLB的详细解释与安装
  • #07【面试问题整理】嵌入式软件工程师
  • c#快速获取超大文件夹文件名
  • LVS – NAT 模式集群构建
  • 重学java 64.IO流 字符流
  • Java SE LTS版本商用收费,有那些开源的替代方案?
  • PDF批量加水印 与 去除水印实践
  • [CAN] 创建解析CAN报文DBC文件教程
  • 大模型算法岗常见面试题100道(含答案)
  • 哲学家进餐问题
  • SSL/TLS和HTTPS
  • mysql的双机热备
  • Linux “ 软件管理 “
  • SHELL脚本学习(七) 脚本控制
  • 免费学习通刷课(免费高分)Pro版
  • JavaScript-如何实现克隆(clone)函数
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • angular学习第一篇-----环境搭建
  • Apache Zeppelin在Apache Trafodion上的可视化
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • JAVA_NIO系列——Channel和Buffer详解
  • Python中eval与exec的使用及区别
  • React中的“虫洞”——Context
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • 看域名解析域名安全对SEO的影响
  • 老板让我十分钟上手nx-admin
  • 前端工程化(Gulp、Webpack)-webpack
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • 写代码的正确姿势
  • 移动端唤起键盘时取消position:fixed定位
  • ​LeetCode解法汇总2583. 二叉树中的第 K 大层和
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • #window11设置系统变量#
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • #我与Java虚拟机的故事#连载17:我的Java技术水平有了一个本质的提升
  • (8)STL算法之替换
  • (html5)在移动端input输入搜索项后 输入法下面为什么不想百度那样出现前往? 而我的出现的是换行...
  • (java)关于Thread的挂起和恢复
  • (多级缓存)缓存同步
  • (二)WCF的Binding模型
  • (翻译)Entity Framework技巧系列之七 - Tip 26 – 28
  • (十六)Flask之蓝图
  • (转)拼包函数及网络封包的异常处理(含代码)
  • **登录+JWT+异常处理+拦截器+ThreadLocal-开发思想与代码实现**
  • .bat批处理(九):替换带有等号=的字符串的子串
  • .NET Core跨平台微服务学习资源
  • .net core使用EPPlus设置Excel的页眉和页脚
  • .net framework profiles /.net framework 配置
  • .Net小白的大学四年,内含面经
  • @RunWith注解作用
  • @SuppressWarnings注解
  • @transactional 方法执行完再commit_当@Transactional遇到@CacheEvict,你的代码是不是有bug!...
  • [ HTML + CSS + Javascript ] 复盘尝试制作 2048 小游戏时遇到的问题
  • [1181]linux两台服务器之间传输文件和文件夹