Springboot中整合MongoDB进行聚合操作
MongoTemplate提供了aggregate方法来实现对数据的聚合操作

基于聚合管道mongodb提供的可操作的内容:

基于聚合操作Aggregation.group,mongodb提供可选的表达式

示例:以聚合管道示例2为例
实体结构 @Document("zips") @Data @AllArgsConstructor @NoArgsConstructor public class Zips { @Id //映射文档中的_id private String id; @Field private String city; @Field private Double[] loc; @Field private Integer pop; @Field private String state; }
返回人口超过1000万的州 db.zips.aggregate( [ { $group: { _id: "$state", totalPop: { $sum: "$pop" } } }, { $match: { totalPop: { $gt: 10*1000*1000 } } } ] ) java实现 @Test public void test(){ //$group GroupOperation groupOperation = Aggregation.group("state").sum("pop").as("totalPop"); //$match MatchOperation matchOperation = Aggregation.match( Criteria.where("totalPop").gte(10*1000*1000)); // 按顺序组合每一个聚合步骤 TypedAggregation<Zips> typedAggregation = Aggregation.newAggregation(Zips.class, groupOperation, matchOperation); //执行聚合操作,如果不使用 Map,也可以使用自定义的实体类来接收数据 AggregationResults<Map> aggregationResults = mongoTemplate.aggregate(typedAggregation, Map.class); // 取出最终结果 List<Map> mappedResults = aggregationResults.getMappedResults(); for(Map map:mappedResults){ System.out.println(map); } } 返回各州平均城市人口 db.zips.aggregate( [ { $group: { _id: { state: "$state", city: "$city" }, cityPop: { $sum: "$pop" } } }, { $group: { _id: "$_id.state", avgCityPop: { $avg: "$cityPop" } } }, { $sort:{avgCityPop:-1}} ] ) java实现 @Test public void test2(){ //$group GroupOperation groupOperation = Aggregation.group("state","city").sum("pop").as("cityPop"); //$group GroupOperation groupOperation2 = Aggregation.group("_id.state").avg("cityPop").as("avgCityPop"); //$sort SortOperation sortOperation = Aggregation.sort(Sort.Direction.DESC,"avgCityPop"); // 按顺序组合每一个聚合步骤 TypedAggregation<Zips> typedAggregation = Aggregation.newAggregation(Zips.class, groupOperation, groupOperation2,sortOperation); //执行聚合操作,如果不使用 Map,也可以使用自定义的实体类来接收数据 AggregationResults<Map> aggregationResults = mongoTemplate.aggregate(typedAggregation, Map.class); // 取出最终结果 List<Map> mappedResults = aggregationResults.getMappedResults(); for(Map map:mappedResults){ System.out.println(map); } }
按州返回最大和最小的城市 db.zips.aggregate( [ { $group: { _id: { state: "$state", city: "$city" }, pop: { $sum: "$pop" } } }, { $sort: { pop: 1 } }, { $group: { _id : "$_id.state", biggestCity: { $last: "$_id.city" }, biggestPop: { $last: "$pop" }, smallestCity: { $first: "$_id.city" }, smallestPop: { $first: "$pop" } } }, { $project: { _id: 0, state: "$_id", biggestCity: { name: "$biggestCity", pop: "$biggestPop" }, smallestCity: { name: "$smallestCity", pop: "$smallestPop" } } }, { $sort: { state: 1 } } ] ) java实现 @Test public void test3(){ //$group GroupOperation groupOperation = Aggregation .group("state","city").sum("pop").as("pop"); //$sort SortOperation sortOperation = Aggregation .sort(Sort.Direction.ASC,"pop"); //$group GroupOperation groupOperation2 = Aggregation .group("_id.state") .last("_id.city").as("biggestCity") .last("pop").as("biggestPop") .first("_id.city").as("smallestCity") .first("pop").as("smallestPop"); //$project ProjectionOperation projectionOperation = Aggregation .project("state","biggestCity","smallestCity") .and("_id").as("state") .andExpression( "{ name: \"$biggestCity\", pop: \"$biggestPop\" }") .as("biggestCity") .andExpression( "{ name: \"$smallestCity\", pop: \"$smallestPop\" }" ).as("smallestCity") .andExclude("_id"); //$sort SortOperation sortOperation2 = Aggregation .sort(Sort.Direction.ASC,"state"); // 按顺序组合每一个聚合步骤 TypedAggregation<Zips> typedAggregation = Aggregation.newAggregation( Zips.class, groupOperation, sortOperation, groupOperation2, projectionOperation,sortOperation2); //执行聚合操作,如果不使用 Map,也可以使用自定义的实体类来接收数据 AggregationResults<Map> aggregationResults = mongoTemplate .aggregate(typedAggregation, Map.class); // 取出最终结果 List<Map> mappedResults = aggregationResults.getMappedResults(); for(Map map:mappedResults){ System.out.println(map); } }

浙公网安备 33010602011771号