首页 > 其他分享 >mongo批量更新的几种方法

mongo批量更新的几种方法

时间:2023-08-26 14:46:51浏览次数:56  
标签:set mongo 批量 update System 几种 Query new currentTimeMillis

50w数据做测试

看一下mongo支持批量更新的几种PAI

 

1.0 public UpdateResult updateMulti(Query query, UpdateDefinition update, Class<?> entityClass)



2.0public UpdateResult updateMulti(Query query, UpdateDefinition update, String collectionName)



3.0public UpdateResult updateMulti(Query query, UpdateDefinition update, Class<?> entityClass, String collectionName)

4.0

 

 

给字段phone加上了唯一索引

/**
* 电话
*/
@Indexed(unique = true)
private String phone;

 

具体写法一:
1.查询集合内所有的数据
 Query query0 = new Query();
        query0.fields().include("phone");
        long l0 = System.currentTimeMillis();
        List<User> users1 = mongoTemplate.find(query0, User.class, "animals");
        List<String> collect = users1.stream().map(User::getPhone).collect(Collectors.toList());
        long l1 = System.currentTimeMillis();
        System.out.println(">>>>>>>>>>>:"+(l1-l0));
2.更新参数

 Update update=new Update();
        update.set("sex","未知");
        update.set("email","[email protected]");
        update.set("work","焊武大帝");
        UpdateOptions updateOptions=new UpdateOptions();
        updateOptions.upsert(false);
        Query query = new Query();
        Criteria criteria=new Criteria();
        criteria.and("phone").in(collect);
        query.addCriteria(criteria);

3.具体更新

 long l2= System.currentTimeMillis();
 mongoTemplate.updateMulti(query, update, User.class,"animals");
long l3= System.currentTimeMillis();
 System.out.println(">>>>>>>>>>>>>>>:"+(l3-l2));

4.结果

>>>>>>>>>>>:2379(查询整个集合一个字段出来在2.5s以内)
>>>>>>>>>>>>>>>:7629(更新50w控制在8s以内)
总计在12s以内,还可以接受

 

具体写法二:
     1.0查询: Query query0 = new Query();
        query0.fields().include("phone");
        long l0 = System.currentTimeMillis();
        List<User> users1 = mongoTemplate.find(query0, User.class, "animals");
        List<String> collect =users1.stream().map(User::getPhone).collect(Collectors.toList());
        long l1 = System.currentTimeMillis();
        System.out.println(">>>>>>>>>>>:"+(l1-l0));
        Update update=new Update();
        update.set("sex","未知0");
        update.set("email","[email protected]");
        update.set("work","焊武大帝0");
        UpdateOptions updateOptions=new UpdateOptions();
      2.更新参数:  updateOptions.upsert(false);
        Query query = new Query();
        Criteria criteria=new Criteria();
        criteria.and("phone").in(collect);
        query.addCriteria(criteria);
        long l2= System.currentTimeMillis();


      3.0具体执行:  BulkOperations bulkOps = mongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED, "animals");
        bulkOps.updateMulti(query, update);

        bulkOps.execute();
        long l3= System.currentTimeMillis();
        System.out.println(">>>>>>>>>>>>>>>:"+(l3-l2));
4.0执行结果
>>>>>>>>>>>:2408(查询组织参数)
>>>>>>>>>>>>>>>:7769(50w执行)

 

具体写法三:(如果phone不加索引,会非常非常慢)
1.0  List<Pair<Query, Update>> updates=new ArrayList<>();
        collect.stream().forEach(ele->{
            Query query1 = new Query();
            query1.addCriteria(new Criteria().and("phone").is(ele));
            Update update0=new Update();
            update0.set("sex","未知");
            update0.set("email","[email protected]");
            update0.set("work","焊武大帝");
            Pair<Query, Update> of = Pair.of(query1, update0);
            updates.add(of);
        });
        BulkOperations bulkOps = mongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED, "animals");


     bulkOps.updateMulti(updates);
        bulkOps.execute();
        long l3= System.currentTimeMillis();
        System.out.println(">>>>>>>>>>>>>>>:"+(l3-l2));

2.0结果
>>>>>>>>>>>:2434(查询50w)
>>>>>>>>>>>>>>>:32490(执行50w,比上次时间高出了4倍!)

 

描述:
方法一和方法二结果基本一致,这两个都是基本的更新某个或者某几个字段
方法三除了多了一次50w的循环, List<Pair<Query, Update>> updates=new ArrayList<>();里面会在mongo内部执行50w操作,所以耗时比较严重。

 

标签:set,mongo,批量,update,System,几种,Query,new,currentTimeMillis
From: https://www.cnblogs.com/wangbiaohistory/p/17658767.html

相关文章

  • 批量扫描二维码
    该脚本局限性较大,需要文件夹内的二维码图片命名为整型适合场景:二维码扫描结果为1或0,二维码数量庞大importzxingimportosfilepath=r"文件夹路径"l=os.listdir(filepath)l.sort(key=lambdax:int(x[:-4]))t=''foriinl:reader=zxing.BarCodeReader()......
  • MySQL 定时备份的几种方式
    mysqldump命令备份数据在MySQL中提供了命令行导出数据库数据以及文件的一种方便的工具mysqldump,我们可以通过命令行直接实现数据库内容的导出dump,首先我们简单了解一下mysqldump命令用法:#MySQLdump常用mysqldump-uroot-p--databases数据库1数据库2>xxx.sqlmysqldump常......
  • openresty中几种重定向的差异比较(ngx.redirect、ngx.req.set_uri、ngx.exec)
    一.测试用的nginx.conf: userroot;worker_processes1;error_loglogs/error.log;events{worker_connections1024;}http{charsetutf-8;default_typeapplication/octet-stream; include/usr/local/openresty/nginx/conf/mime.typ......
  • 分享一个批量转换某个目录下的所有ppt->pdf的Python代码
    大家好,我是皮皮。一、前言前几天在Python最强王者群【Python小小小白】分享了一份Python自动化办公的代码,可以批量转换某个目录下的所有ppt->pdf,非常强大。二、实现过程在正式跑代码之后,你可能需要按照对应的库,不然会报错。代码运行之后,本地会出现下面的UI界面,选择PPT文件......
  • 舞蹈考级证书有几种 考级哪个最权威
    中国舞考级一共有十三级,芭蕾舞考级一共有八级,还有各个省舞协出版的舞蹈考级教材,级别数都不一样的。舞蹈考级证书有几种,哪个最权威,下面让我们一起来可以看,以下内容仅供参考。正规权威的中国舞考级证书正规的中国舞考级证书有三种,发证单位分别是北京舞蹈学院、中国舞蹈家协会、中......
  • blender制作体积云烟雾的几种方法
    blender制作体积云烟雾的几种方法一.利用着色器节点(Cycles渲染器)1.新建一个立方体,材质节点如下。(根据情况调整合适的参数)2.打一个面光就完成了。渲染效果图二.利用修改器(Cycles渲染器)1.创建多个融球堆叠形成不规则体2.选中所有融球ctrl+J合并所有融球3.物体-转换-......
  • Mongodb数据库基于spring-boot-starter-data-mongodb的查询工具
    /***字段注解*/public@interfaceBuilderField{/***对应的数据库字段名称*@return*/Stringname();}importlombok.SneakyThrows;importjava.io.Serializable;importjava.lang.invoke.SerializedLambda;importjava.lang.reflec......
  • 国标视频云服务EasyGBS国标视频平台批量开启按需直播详细操作步骤
    国标视频云服务EasyGBS支持设备/平台通过国标GB28181协议注册接入,并能实现视频的实时监控直播、录像、检索与回看、语音对讲、云存储、告警、平台级联等功能。平台部署简单、可拓展性强,支持将接入的视频流进行全终端、全平台分发,分发的视频流包括RTSP、RTMP、FLV、HLS、WebRTC等格......
  • 国标视频云服务EasyGBS国标视频平台批量开启按需直播详细操作步骤
    国标视频云服务EasyGBS支持设备/平台通过国标GB28181协议注册接入,并能实现视频的实时监控直播、录像、检索与回看、语音对讲、云存储、告警、平台级联等功能。平台部署简单、可拓展性强,支持将接入的视频流进行全终端、全平台分发,分发的视频流包括RTSP、RTMP、FLV、HLS、WebRTC等......
  • 直播平台搭建,JSON.parseObject的几种用法
    直播平台搭建,JSON.parseObject的几种用法一.result格式: {  "success":"true",  "returnAddress":"123"} JSONObjectjsonObject=JSON.parseObject(result); //转换成objectJsonObject.getString("returnAddress") //获取object中ret......