由于历史原因,我们的数据都是存在mongdb中,单个数据存储比较大,随着业务迭代更新,需要对存储的数据进行分组查询。
需求:动态对某一个字段进行数据统计,并可以有一些常用的筛选条件。
开始干活,对于其他多余的代码就不贴了,关键代码,先看效果
operations.add(Aggregation.group(parm.getField()).count().as("count"));
operations.add(Aggregation.project(parm.getField(), "count"));
operations.add(Aggregation.sort(Sort.Direction.ASC, parm.getField()));
Aggregation agg = Aggregation.newAggregation(operations);
return mongoTemplate.aggregate(agg, parm.getType().getType().toString(), ParStatisticsResultVo.class).getMappedResults();
这段代码呢,是不可用的,因为这个排序不生效,最终 运行出来的mongo语句如下:
db.respRebuild.aggregate([{ "$match" : { "real_br" : { "$gte" : 10.0 } } }, { "$match" : { "real_br" : { "$lte" : 100.0 } } }, { "$group" : { "_id" : "$real_br", "count" : { "$sum"
在sort位置的real_br排序是不正确的,因为group没有这个字段,group只有_id和count,而Aggregation.group是自动会把parm.getField()字段做为_id处理,这时根本结果里就没有这个字段,所以谈不上排序。
那么把 { “KaTeX parse error: Expected 'EOF', got '}' at position 27: …"real_br" :1 } }直接改为 { "sort” : { “_id” :1 } }这样是可行的,但是在Aggregation并没有这样的入口。如果强行将
operations.add(Aggregation.sort(Sort.Direction.ASC, parm.getField()));
写成
operations.add(Aggregation.sort(Sort.Direction.ASC, '_id'));
这样也不行,会提示错误。
从结果来看,首先我们需要在group中把这些字段给查出来,然后需要在project中把我们需要的字段给添加上,使查询语句满足mongodb的查询规则,如下:
operations.add(Aggregation.group(parm.getField()).count().as("count").first(parm.getField()).as(parm.getField()));
operations.add(Aggregation.project(parm.getField(),"count","_id"));
operations.add(Aggregation.sort(Sort.Direction.ASC,parm.getField()));
Aggregation agg = Aggregation.newAggregation(operations);
return mongoTemplate.aggregate(agg, parm.getType().getType().toString(), ParStatisticsResultVo.class).getMappedResults();
这样的结果查询会多出一个字段来,就可以直接使用parm.getField()进行排序。最终的mongodb查询语句如下:
db.respRebuild.aggregate([{ "$match" : { "real_br" : { "$gte" : 10.0 } } }, { "$match" : { "real_br" : { "$lte" : 100.0 } } }, { "$group" : { "_id" : "$real_br", "count" : { "$sum"
由于历史原因,我们的数据都是存在mongdb中,单个数据存储比较大,随着业务迭代更新,需要对存储的数据进行分组查询。
需求:动态对某一个字段进行数据统计,并可以有一些常用的筛选条件。
开始干活,对于其他多余的代码就不贴了,关键代码,先看效果
operations.add(Aggregation.group(parm.getField()).count().as("count"));
operations.add(Aggregation.project(parm.getField(), "count"));
operations.add(Aggregation.sort(Sort.Direction.ASC, parm.getField()));
Aggregation agg = Aggregation.newAggregation(operations);
return mongoTemplate.aggregate(agg, parm.getType().getType().toString(), ParStatisticsResultVo.class).getMappedResults();
这段代码呢,是不可用的,因为这个排序不生效,最终 运行出来的mongo语句如下:
db.respRebuild.aggregate([{ "$match" : { "real_br" : { "$gte" : 10.0 } } }, { "$match" : { "real_br" : { "$lte" : 100.0 } } }, { "$group" : { "_id" : "$real_br", "count" : { "$sum"
在sort位置的real_br排序是不正确的,因为group没有这个字段,group只有_id和count,而Aggregation.group是自动会把parm.getField()字段做为_id处理,这时根本结果里就没有这个字段,所以谈不上排序。
那么把 { “KaTeX parse error: Expected 'EOF', got '}' at position 27: …"real_br" :1 } }直接改为 { "sort” : { “_id” :1 } }这样是可行的,但是在Aggregation并没有这样的入口。如果强行将
operations.add(Aggregation.sort(Sort.Direction.ASC, parm.getField()));
写成
operations.add(Aggregation.sort(Sort.Direction.ASC, '_id'));
这样也不行,会提示错误。
从结果来看,首先我们需要在group中把这些字段给查出来,然后需要在project中把我们需要的字段给添加上,使查询语句满足mongodb的查询规则,如下:
operations.add(Aggregation.group(parm.getField()).count().as("count").first(parm.getField()).as(parm.getField()));
operations.add(Aggregation.project(parm.getField(),"count","_id"));
operations.add(Aggregation.sort(Sort.Direction.ASC,parm.getField()));
Aggregation agg = Aggregation.newAggregation(operations);
return mongoTemplate.aggregate(agg, parm.getType().getType().toString(), ParStatisticsResultVo.class).getMappedResults();
这样的结果查询会多出一个字段来,就可以直接使用parm.getField()进行排序。最终的mongodb查询语句如下:
db.respRebuild.aggregate([{ "$match" : { "real_br" : { "$gte" : 10.0 } } }, { "$match" : { "real_br" : { "$lte" : 100.0 } } }, { "$group" : { "_id" : "$real_br", "count" : { "$sum"
由于历史原因,我们的数据都是存在mongdb中,单个数据存储比较大,随着业务迭代更新,需要对存储的数据进行分组查询。
需求:动态对某一个字段进行数据统计,并可以有一些常用的筛选条件。
开始干活,对于其他多余的代码就不贴了,关键代码,先看效果
operations.add(Aggregation.group(parm.getField()).count().as("count"));
operations.add(Aggregation.project(parm.getField(), "count"));
operations.add(Aggregation.sort(Sort.Direction.ASC, parm.getField()));
Aggregation agg = Aggregation.newAggregation(operations);
return mongoTemplate.aggregate(agg, parm.getType().getType().toString(), ParStatisticsResultVo.class).getMappedResults();
这段代码呢,是不可用的,因为这个排序不生效,最终 运行出来的mongo语句如下:
db.respRebuild.aggregate([{ "$match" : { "real_br" : { "$gte" : 10.0 } } }, { "$match" : { "real_br" : { "$lte" : 100.0 } } }, { "$group" : { "_id" : "$real_br", "count" : { "$sum"
在sort位置的real_br排序是不正确的,因为group没有这个字段,group只有_id和count,而Aggregation.group是自动会把parm.getField()字段做为_id处理,这时根本结果里就没有这个字段,所以谈不上排序。
那么把 { “KaTeX parse error: Expected 'EOF', got '}' at position 27: …"real_br" :1 } }直接改为 { "sort” : { “_id” :1 } }这样是可行的,但是在Aggregation并没有这样的入口。如果强行将
operations.add(Aggregation.sort(Sort.Direction.ASC, parm.getField()));
写成
operations.add(Aggregation.sort(Sort.Direction.ASC, '_id'));
这样也不行,会提示错误。
从结果来看,首先我们需要在group中把这些字段给查出来,然后需要在project中把我们需要的字段给添加上,使查询语句满足mongodb的查询规则,如下:
operations.add(Aggregation.group(parm.getField()).count().as("count").first(parm.getField()).as(parm.getField()));
operations.add(Aggregation.project(parm.getField(),"count","_id"));
operations.add(Aggregation.sort(Sort.Direction.ASC,parm.getField()));
Aggregation agg = Aggregation.newAggregation(operations);
return mongoTemplate.aggregate(agg, parm.getType().getType().toString(), ParStatisticsResultVo.class).getMappedResults();
这样的结果查询会多出一个字段来,就可以直接使用parm.getField()进行排序。最终的mongodb查询语句如下:
db.respRebuild.aggregate([{ "$match" : { "real_br" : { "$gte" : 10.0 } } }, { "$match" : { "real_br" : { "$lte" : 100.0 } } }, { "$group" : { "_id" : "$real_br", "count" : { "$sum"
由于历史原因,我们的数据都是存在mongdb中,单个数据存储比较大,随着业务迭代更新,需要对存储的数据进行分组查询。
需求:动态对某一个字段进行数据统计,并可以有一些常用的筛选条件。
开始干活,对于其他多余的代码就不贴了,关键代码,先看效果
operations.add(Aggregation.group(parm.getField()).count().as("count"));
operations.add(Aggregation.project(parm.getField(), "count"));
operations.add(Aggregation.sort(Sort.Direction.ASC, parm.getField()));
Aggregation agg = Aggregation.newAggregation(operations);