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 {
    @Resource
    private 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;
        }
        //更新或插入List
        List<Pair<Query, Update>> updateList = new ArrayList<>(orderDOList.size());
        //bulk operation
        BulkOperations 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();
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值