Aggregation agg = Aggregation.newAggregation(match,group,project); 讲解下这个的用法 以及来个使用案例
时间: 2024-02-01 13:04:35 浏览: 165
这段代码是使用 Spring Data MongoDB 的 Aggregation Framework 实现数据聚合的操作,主要包含以下三个步骤:
1. Match:筛选出符合条件的文档,类似于 SQL 中的 WHERE 子句。
2. Group:按照指定的字段进行分组,类似于 SQL 中的 GROUP BY 子句。
3. Project:对分组后的结果进行投影,类似于 SQL 中的 SELECT 子句。
下面是一个使用案例:
假设我们有一个名为 orders 的文档集合,包含以下字段:
```
{
"_id": ObjectId("5f1d5a8c4cba2a5bc0a72d1a"),
"user_id": 1001,
"items": [
{
"name": "iPhone 11",
"price": 6999
},
{
"name": "MacBook Pro",
"price": 12999
}
],
"create_time": ISODate("2020-07-26T12:00:00Z")
}
```
我们希望统计每个用户的订单总金额,并按照总金额倒序排序,可以使用以下代码实现:
```
// 创建 Match 对象
Criteria match = Criteria.where("create_time").gt(start).lt(end);
// 创建 Group 对象
GroupOperation group = Aggregation.group("user_id")
.sum("items.price").as("total_price");
// 创建 Project 对象
ProjectionOperation project = Aggregation.project("user_id", "total_price")
.andExclude("_id").andInclude("user_id", "total_price");
// 执行聚合操作
Aggregation agg = Aggregation.newAggregation(match, group, project);
List<UserOrder> result = mongoTemplate.aggregate(agg, "orders", UserOrder.class).getMappedResults();
```
上述代码中,我们首先创建了一个 Match 对象,筛选出符合条件的文档(在指定时间范围内创建的订单)。然后创建了一个 Group 对象,按照 user_id 字段进行分组,并对每个分组内的 items.price 字段求和,得到总金额并将其赋值给 total_price 字段。最后创建了一个 Project 对象,投影出 user_id 和 total_price 两个字段并排除 _id 字段,然后执行聚合操作并将结果映射到 UserOrder 类型的对象列表中。
注意,这里的 UserOrder 类型需要定义为一个包含 user_id 和 total_price 两个字段的 POJO 类型。
阅读全文