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);
}
}

 

posted @ 2022-07-31 10:15  VNone  阅读(2055)  评论(0)    收藏  举报