需求:在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++要点概要,如有需要可以进行阅读!
指针与引用的区分
- 指针是一个变量, 只不过这个变量存储的是一个地址, 指向内存的一个存储单元; 而引用跟原来的变量实质上是同一个东西, 只不过是原变量的一个别名而已。 引用没有自己的内存空间, 但指针有自己的内存空间。
- 指针的值可以为空, 也可能指向一个不确定的内存空间, 但是引用的值不能为空, 并且引用在定义的时候必须初始化为特定对象; (因此引用更安全)。
即: 空值 NULL 不能引用, 而指针可以指向 NULL; 引用必须在声明时初始化, 而指针不用。 - 引用声明后, 引用的对象不可改变, 对象的值可以改变, 指针可以随时改变指向的对象以及对象的值。
- 指针和引用的自增(++)运算意义不一样。
文件打开形式设定
虚函数
构造函数不能声明为虚函数, 析构函数可以声明为虚函数, 而且有时是必须声明为虚函数。
构造函数为什么不能声明为虚函数?
答:
- 构造一个对象的时候, 必须知道对象的实际类型, 而虚函数行为是在运行期间确定实际类型的。 而在构造一个对象时, 由于对象还未构造成功。 编译器无法知道对象的实际类型是该类本身, 还是该类的一个派生类, 或是更深层次的派生类,无法确定。
- 虚函数的执行依赖于虚函数表。 而虚函数表在构造函数中进行初始化工作, 即初始化 vptr,让他指向正确的虚函数表。 而在构造对象期间, 虚函数表还没有被初始化, 将无法进行。 析构函数执行时先调用派生类的析构函数, 其次才调用基类的析构函数。
析构函数为什么声明为虚函数?
答:如果析构函数不是虚函数, 而程序执行时又要通过基类的指针去销毁派生类的动态对象,那么用 delete 销毁对象时, 只调用了基类的析构函数, 未调用派生类的析构函数。 这样会造成销毁对象不完全。