springData 实现mongodb 分组(group)操作

废话不多说 直接上代码吧

import org.springframework.data.mongodb.core.aggregation.Aggregation;
import org.springframework.data.mongodb.core.aggregation.AggregationResults;
import org.springframework.data.mongodb.core.aggregation.TypedAggregation;
        TypedAggregation agg = Aggregation.newAggregation(MongoQuotesNewsBean.class,
                Aggregation.skip(start),
                Aggregation.limit(end),
                Aggregation.group("stockId").first("stockId").as("stockIdFirst").first("pubTime").as("pubTime"),
                Aggregation.sort(new Sort(Sort.Direction.DESC, "pubTime")),
                Aggregation.project("stockIdFirst")
        );
        AggregationResults aggregationResults = mongoTemplate.aggregate(agg, "quotes_news", Map.class);
        List stockIdMapList = aggregationResults.getMappedResults();

前提概要:

  1.MongoQuotesNewsBean 是MongoDB 存储的实体类 

  2. "stockId"是带查询mongo实体类的属性

  3."stockIdFirst"是自定义的返回值别名 可以查询结果中取得。

执行顺序由上到下,如上代码会先执行

  1.按【pubTime】也是就发布时间倒叙。

  2.指定操作数据的范围

  3.按【stockId】分组查询 并获取分组后 各个分组第一条记录中的 【stockId】字段 重命名为 【stockIdFirst】 

  4.返回指定字段 上面返回的就是 分组后查出的 【stockIdFirst】

注意:group("分组字段").first("结果需要返回的字段)

          要在group后使用排序,那么排序字段需要用first返回,否则会报错

java.lang.IllegalArgumentException: Invalid reference 'pubTime'!

执行结果如下图所示:

springData 实现mongodb 分组(group)操作_第1张图片

springData 实现mongodb 分组(group)操作_第2张图片

聚合查询结果解析:

  1.分组的查询结果通过mappedResults获取 返回的是一个只读的List,通过上面的结果可以看到 上面的查询返回了我需要的stockIdFirst和实体类主键id。

  2.rawResults中可以获取查询返回结果总数。

你可能感兴趣的:(mongodb)