mongo spring 分组求单字段最大值以及处于最大值数据的其他字段

今天接到一个任务,统计一张mongo中询价表中的数据,字段有cityName,cityId,calDate,updateDate,price,amountOfIncrease.

这张表是每隔一段时间生成数据,所有会存在cityId相同而calDate不同的情况,现在要查出calDate离现在最近的每个城市的数据,也就是说要按城市分组,查出每个城市中calDate最大的数据.

最开始我想的是用聚合操作分组查出每个城市的calDate最大值,后来发现聚合的分组不能将除了分组的key(也就是分组字段)的其他字段查出来.在网上查了很多资料,都没有用spring template实现的,后来看到mongo查询语法中有个first,也就是可以只取第一条,如果分组也能取第一条,那么利用排序,问题就解决了.

看了下API,果然有first,不过是每个需要的字段都需要用first

List<AggregationOperation> operations = new ArrayList<>();
operations.add(Aggregation.match(Criteria.where("cityId").in(ids)));
operations.add(Aggregation.group("cityId")
    .max("calDate").as("calDate").first("cityName").as("cityName")
.first("updateDate").as("updateDate").first("price").as("price").first("amountOfIncrease").as("amountOfIncrease")
);
operations.add(Aggregation.sort(Sort.Direction.DESC, "calDate"));
Aggregation aggregation = Aggregation.newAggregation(operations);
AggregationResults<BasicDBObject> g = mongoDdlpdbTemplate.aggregate(aggregation, CityPrice.class, BasicDBObject.class);

问题解决


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值