【mongodb】用AggregationOptions实现以10分钟为间隔获取数据


需求:在mongodb 数据库中,用AggregationOptions实现以10分钟为间隔获取数据

AggregationOptions

AggregationOptions是一个用于指定聚合操作选项的。它提供了一些设置和控制聚合操作行为的方法和属性。在数据库或数据处理中,聚合操作是一种将多个数据项合并为一个结果的操作,常用于计算统计值或生成汇总报告。AggregationOptions可以用于定义聚合操作的参数和选项,比如排序、分组、筛选条件等。

实现方法

Date today= DateFormat.S2DD("2022-04-06 00:00:00");
        Criteria criteria=Criteria.where("teamId").is("89999").
                and("updateTime").gte(today);

        /**
         * 防止出现同一条数据
         */
        GroupOperation groupSum = Aggregation.group("$machineId","$updateTime")
                .first("machineName").as("machineName")
                .first("machineId").as("machineId")
                .first("updateTime").as("updateTime");

        String formate = "%Y-%m-%d %H:%M:00";
        //日期按照 “%Y-%m-%d %H:%M:00”格式化,并变成字符串
        AggregationExpression dateExpression = DateOperators.DateToString
                .dateOf("updateTime")
                .toString(formate)
                .withTimezone(
                        DateOperators.Timezone.valueOf("+08")
                );
        String formate1 = "%Y-%m-%d %H:%M:%S";
        //日期按照 “%Y-%m-%d %H:%M:00”格式化,并变成字符串
        AggregationExpression dateExpression1 = DateOperators.DateToString
                .dateOf("updateTime")
                .toString(formate1)
                ;


        ProjectionOperation pro = Aggregation.project("machineId","machineName")
                .and(dateExpression).as("minterTime")//1分钟
                .and("updateTime").substring(0,15).as("tenMinTime");//10分钟

        GroupOperation group = Aggregation.group("$tenMinTime")
               // .first("updateTime").as("updateTime")
                .first("machineName").as("machineName")
                .first("machineId").as("machineId")
                .first("tenMinTime").as("tenMinTime");

        AggregationOptions aggregationOptions = AggregationOptions.builder().allowDiskUse(true).build();
        Aggregation aggregation =  Aggregation.newAggregation(
                Aggregation.match(criteria)
                ,groupSum
                ,pro
                ,group
                ,Aggregation.sort(Sort.Direction.ASC,"machineId")//降序
        ).withOptions(aggregationOptions);

        AggregationResults<Map> aggregate = mongoTemplate.aggregate(aggregation, "data_run_zero", Map.class);
        List<Map> mappedResults = aggregate.getMappedResults();

额外补充

需求实现部分就先到这!接下来,是一些个人平时整理的c++要点概要,如有需要可以进行阅读

指针与引用的区分

  1. 指针是一个变量, 只不过这个变量存储的是一个地址, 指向内存的一个存储单元; 而引用跟原来的变量实质上是同一个东西, 只不过是原变量的一个别名而已。 引用没有自己的内存空间, 但指针有自己的内存空间
  2. 指针的值可以为空, 也可能指向一个不确定的内存空间, 但是引用的值不能为空, 并且引用在定义的时候必须初始化为特定对象; (因此引用更安全)。
    即: 空值 NULL 不能引用, 而指针可以指向 NULL引用必须在声明时初始化, 而指针不用
  3. 引用声明后, 引用的对象不可改变, 对象的值可以改变, 指针可以随时改变指向的对象以及对象的值。
  4. 指针和引用的自增(++)运算意义不一样。

文件打开形式设定

在这里插入图片描述

虚函数

构造函数不能声明为虚函数, 析构函数可以声明为虚函数, 而且有时是必须声明为虚函数。

构造函数为什么不能声明为虚函数?

答:

  1. 构造一个对象的时候, 必须知道对象的实际类型, 而虚函数行为是在运行期间确定实际类型的。 而在构造一个对象时, 由于对象还未构造成功。 编译器无法知道对象的实际类型是该类本身, 还是该类的一个派生类, 或是更深层次的派生类,无法确定。
  2. 虚函数的执行依赖于虚函数表。 而虚函数表在构造函数中进行初始化工作, 即初始化 vptr,让他指向正确的虚函数表。 而在构造对象期间, 虚函数表还没有被初始化, 将无法进行。 析构函数执行时先调用派生类的析构函数, 其次才调用基类的析构函数

析构函数为什么声明为虚函数?

答:如果析构函数不是虚函数, 而程序执行时又要通过基类的指针去销毁派生类的动态对象,那么用 delete 销毁对象时, 只调用了基类的析构函数, 未调用派生类的析构函数。 这样会造成销毁对象不完全。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

傻傻虎虎

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值