首页 > 其他分享 >mongoTemplate工作中常用方式

mongoTemplate工作中常用方式

时间:2023-01-05 10:59:33浏览次数:59  
标签:常用 方式 getMsgTime Criteria Aggregation mongoTemplate criteria new

MongoTemplate官方文档:

https://docs.spring.io/spring-data/mongodb/docs/current/reference/html/#mongo.aggregation.supported-aggregation-operations

一、增删改查

原生mongo:

Query对象

1、 创建一个query对象(用来封装所有条件对象),再创建一个criteria对象(用来构建条件)

2 、精准条件:criteria.and("key").is("条件") 模糊条件:criteria.and("key").regex("条件")

3、封装条件:query.addCriteria(criteria)

4、大于(创建新的criteria):Criteria gt = Criteria.where("key").gt("条件") 小于(创建新的criteria):Criteria lt = Criteria.where("key").lt("条件") 5、Query.addCriteria(new Criteria().andOperator(gt,lt));

6、一个query中只能有一个andOperator()。其参数也可以是Criteria数组。

7、排序 :query.with(new Sort(Sort.Direction.ASC, "age"). and(new Sort(Sort.Direction.DESC, "date")))

二、mongoTemplate分组排序、复杂操作

   

分组方法

理解难度

性能对比

是否提倡

mongoTemplate.group();

对比来将这个简单点

70w数据需要2分30秒

在springBoot新的集成环境下,mongoDB已经淘汰该方法了

mongoTemplate.aggregation();

理解之后特别好用

同环境下只需10秒不到

使用中

   1、mongoTemplate.group(); 分组但并不能使用排序,已经废弃

        //封装具体的筛选条件
        Criteria criteria = new Criteria();
        criteria.andOperator(
                // 筛选大于 getMsgTime > startTime 和 getMsgTime < endTime 的数据 (getMsgTime)
                Criteria.where("getMsgTime").gte(startTime),
                Criteria.where("getMsgTime").lte(endTime));
        //mongoDB按"deviceCode"分组 ,这里会默认保留分组字段
        GroupBy groupBy = GroupBy.key("deviceCode")
                //新增保留字段 并初始化
                .initialDocument("{ count: 0 , onlineCount: 0 , lastTime: 0}")
                //对分组后的数据进行运算 doc代表当前文档,prev代表结果文档 func里面可以使用js语法
                .reduceFunction("function(doc, prev) { prev.count++ ; if(doc.ctlStatus == 1){prev.onlineCount += 1 ;prev.lastTime = doc.getMsgTime ; }}");
        //criteria: 筛选条件 , CTL_HEART_BEAT:集合名称/表名 ,DeviceGroupByResult.class:接收数据对象
        GroupByResults<DeviceGroupByResult> results = mongoTemplate.group(criteria, "CTL_HEART_BEAT", groupBy, DeviceGroupByResult.class);

        /**这里的接收数据 对象 指的是 将 保留字段 封装成一个对象,并添加get/set方法
         * 这里 DeviceGroupByResult.class 类中就包含 deviceCode、count、onlineCount、lastTime 这些属性。
         */
        //对结果集进行处理 这里只能拿到iterator对象,在我看来itertator并没有List集合 香
        Iterator<DeviceGroupByResult> iterator = results.iterator();
        while (iterator.hasNext()) {
            //看了下源码这个地方 result.iterator 返回的就是就是结果集 但是只能用迭代器读取
            DeviceGroupByResult deviceGroupByResult = iterator.next();
        }

2、mongoTemplate.aggregation(); 分组并排序,推荐使用这种方式

        //封装具体的筛选条件
        Criteria criteria = new Criteria();
        criteria.andOperator(
                // 筛选大于 getMsgTime > startTime 和 getMsgTime < endTime 的数据 (getMsgTime)
                Criteria.where("getMsgTime").gte(startTime),
                Criteria.where("getMsgTime").lte(endTime));
        //mogoDB按device_code分组查询
        Aggregation aggregation = Aggregation.newAggregation(
                Aggregation.match(criteria),//添加筛选方法
                Aggregation.group("deviceCode").first("deviceCode").as("deviceCode") //利用deviceCode分组并保留该字段
                        .last("getMsgTime").as("lastTime")//取最后时间作为保留
                        .count().as("count")//统计分个数
                        //这里的ctlStatus在mongoDB里面是以字符串存储,而我想统计它们之和,但是字符串不能直接相加sum(),所以只能先存到List中
                        .push("ctlStatus").as("currentCtlStatusList")
                        .push("getMsgTime").as("cuurentCtlGetTimeList")//这里之所以把时间也push上去,是因为我要取ctlstatus=1时候的时间
                //这里排序放在分组后面,所以指定的字段只能是lastTime,而放在分组前面就需要指定getMsgTime数据库字段
                //而且使用sort要注意,sort我发现在70w数据面前 就歇菜了 ,而且回报错
                Aggregation.sort(Sort.by(Sort.Order.asc("lastTime")))
        );

        //aggegation:所有条件的封装 , CTL_HEART_BEAT:集合/表 ,DeviceGroupByResult.class:接收数据对象
        AggregationResults<DeviceGroupByResult> deviceGroupByResults = mongoTemplate.aggregate(aggregation, "CTL_HEART_BEAT", DeviceGroupByResult.class);
        //这里就很友好了
        List<DeviceGroupByResult> list = deviceGroupByResults.getMappedResults();

3、循环查询(可能你会遇见需要你循环几次的操作)

        Criteria criteria = new Criteria();
        //timeFrames  时间集合
        for (String time : timeFrames) {
            //将筛选条件封装到agregaton
            Aggregation aggregation = Aggregation.newAggregation(
                    //注意这里使用的是 new criteria.adddOperator(criteria) 每次循环都带一个全新的Criteria条件
                    //按照正常逻辑 是不需要在外面 包一层,但是如你这样做了
                    //循环第一遍没问题,第二遍嘿嘿  会提示  对一个参数做了多次筛选,所以这里做了一个隐式传参
                    Aggregation.match(new Criteria().andOperator(criteria.where("STATISTICS_YEAR").is(time), criteria)),
                    Aggregation.group("STATISTICS_TIME").first("STATISTICS_TIME").as("time").sum("CAR_FLOW").as("count"),
                    Aggregation.sort(Sort.by(Sort.Order.asc("time")))
            );
            AggregationResults<CarFlowResultVO> carFlowResultVOs = mongoTemplate.aggregate(aggregation, tableName, CarFlowResultVO.class);
            carFlowResultVOList = carFlowResultVOs.getMappedResults();
            carFlowResultVOMap.put(String.valueOf(count), carFlowResultVOList);
            carFlowResultVOList = new ArrayList<>();
            count++;
        }

 转载:https://www.cnblogs.com/tiankx/p/13957842.html

标签:常用,方式,getMsgTime,Criteria,Aggregation,mongoTemplate,criteria,new
From: https://www.cnblogs.com/grasp/p/17026888.html

相关文章

  • MongoTemplate的使用
    常用注解:@Document使用@Document(org.springframework.data.mongodb.core.mapping.Document)标注Java的类名对应的MongoDB的集合名称。@Id、@MongoId使用@Id(org.springfram......
  • Oracle JDBC 连接的几种方式
    OracleJDBC连接的几种方式jdbc连接oraclerac数据库的写法:1、方法之一datasource.jdbcUrl=jdbc:oracle:thin:@//192.168.1.43:1521/orcl注意是=号后面的内容。其中orcl......
  • 详解kubernetes五种暴露服务的方式
    部署完服务终将是为了访问,那么kubernetes中service和ingress都可以将集群内部的服务能够支持外部访问。service可以让一组Pod(称为“后端”)为集群内的其他Pod(称为“前端”......
  • firewalld常用命令
    firewall-cmd--zone=public--remove-port=80/tcp--permanent删除80端口firewall-cmd--zone=public--add-port=2201/tcp--permanent添加80端口firewall-cm......
  • snap常用命令
    列出已经安装的snap包sudosnaplist搜索要安装的snap包sudosnapfind<texttosearch>安装一个snap包sudosnapinstall<snapname>更新一个snap包sudosnaprefresh<......
  • tcpdump抓包常用命令
     安装yuminstalltcpdumpaptinstalltcpdump介绍tcpdumpdumpthetrafficonanetwork,根据使用者的定义对网络上的数据包进行截获的包分析工具。 参数-i接......
  • Python爬虫常用哪些库?
    经常游弋在互联网爬虫行业的程序员来说,如何快速的实现程序自动化,高效化都是自身技术的一种沉淀的结果,那么使用Python爬虫都会需要那些数据库支持?下文就是有关于我经常使用的......
  • 微信支付--JSAPI支付(微信小程序和微信公众号支付都可以采用该方式)
    本实例使用了工具包SKIT.FlurlHttpClient.Wechat.TenpayV3(github:https://github.com/fudiwei/DotNetCore.SKIT.FlurlHttpClient.Wechat)示例中的_repositoryWrapper的相关......
  • Redis-01 常用命令
    创建和获取key命令说明例子set创建一个名为key值为value键值对setviews10get获取名为key的值,存在返回值,不存在返回nilgetviewsmset一次......
  • spring boot——spring boot的基本配置——spring boot整合mybatis——本地实例运行—
    POJO类:packageorg.example.entity;publicclassMyUser{privateintid;privateStringname;privateintage;publicintgetId(){......