mongoTemplate对字段拆分再分组
时间: 2023-10-06 14:13:41 浏览: 100
MongoTemplate支持使用聚合管道操作实现对字段的拆分和分组操作。以下是一个示例:
假设有一个名为“orders”的集合,其中每个文档都包含以下字段:
- orderDate:订单日期(格式为“yyyy-MM-dd”)
- orderId:订单ID
- productName:产品名称
- quantity:数量
- price:单价
现在我们想要将订单按照月份和产品名称进行分组,并计算每个月每种产品的总销售额。我们可以使用以下聚合管道操作:
```
Aggregation agg = Aggregation.newAggregation(
Aggregation.project("orderDate", "productName", "quantity", "price"),
Aggregation.project()
.andExpression("substr(orderDate, 0, 7)").as("month")
.andExpression("quantity * price").as("totalPrice"),
Aggregation.group("month", "productName").sum("totalPrice").as("totalSales"),
Aggregation.sort(Sort.Direction.ASC, "month").and(Sort.Direction.ASC, "productName")
);
AggregationResults<MonthlySales> results = mongoTemplate.aggregate(agg, "orders", MonthlySales.class);
List<MonthlySales> monthlySalesList = results.getMappedResults();
```
在这个示例中,我们首先使用“project”操作对原始文档进行投影操作,只保留需要的字段,并添加一个新的“month”字段,用于存储订单日期的月份(通过“substr”表达式实现)。然后,我们使用“group”操作按照“month”和“productName”字段进行分组,并计算每个组的总销售额。最后,我们使用“sort”操作按照月份和产品名称对结果进行排序。
最终的结果是一个名为“MonthlySales”的类的列表,该类定义如下:
```
public class MonthlySales {
private String month;
private String productName;
private double totalSales;
// getters and setters
}
```
请注意,我们还可以使用其他聚合管道操作来实现更复杂的拆分和分组操作。MongoTemplate提供了丰富的聚合操作API,可以满足大多数需求。
阅读全文