java mongdb aggregate sort查询

	由于历史原因,我们的数据都是存在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" : 1 } } }, { "$sort" : {  "real_br" :1 } }])

在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" : 1 }, "real_br" : { "$first" : "$real_br" } } }, { "$project" : { "_id" : 1,"count":1,real_br:1 } } ])
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

豆芽脚脚

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

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

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

打赏作者

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

抵扣说明:

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

余额充值