一般业务会有具体差别,主要可以参考下Aggregation的各个参数用法,以下提供两段代码使用方式
需求:在订单表中,根据buyerNick分组,统计每个buyerNick的电话、地址、支付总金额以及总商品数,返回结果是CustomerDetail。
- /*
- * project:列出所有本次查询的字段,包括查询条件的字段和需要搜索的字段;
- * match:搜索条件criteria
- * unwind:某一个字段是集合,将该字段分解成数组
- * group:分组的字段,以及聚合相关查询
- * sum:求和(同sql查询)
- * count:数量(同sql查询)
- * as:别名(同sql查询)
- * addToSet:将符合的字段值添加到一个集合或数组中
- * sort:排序
- * skip&limit:分页查询
- */
- public List<CustomerDetail> customerDetailList(Integer pageNum,String userId,String buyerNick,String itemId,List<String> phones) throws Exception{
- Criteria criteria = Criteria.where("userId").is(userId);
- Integer pageSize = 10;
- Integer startRows = (pageNum - 1) * pageSize;
- if(buyerNick != null && !"".equals(buyerNick)){
- criteria.and("buyerNick").is(buyerNick);
- }
- if(phones != null && phones.size() > 0){
- criteria.and("mobile").in(phoneList);
- }
- if(itemId != null && !"".equals(itemId)){
- criteria.and("orders.numIid").is(itemId);
- }
- Aggregation customerAgg = Aggregation.newAggregation(
- Aggregation.project("buyerNick","payment","num","tid","userId","address","mobile","orders"),
- Aggregation.match(criteria),
Aggregation.unwind("orders"), - Aggregation.group("buyerNick").first("buyerNick").as("buyerNick").first("mobile").as("mobile").
- first("address").as("address").sum("payment").as("totalPayment").sum("num").as("itemNum").count().as("orderNum"),
- Aggregation.sort(new Sort(new Sort.Order(Sort.Direction.DESC, "totalPayment"))),
- Aggregation.skip(startRows),
- Aggregation.limit(pageSize)
- );
- List<CustomerDetail> customerList = tradeRepository.findAggregateList(new Query(criteria), userId, customerAgg,CustomerDetail.class);
- return customerList;
- }
第二段代码用法参考:
功能描述:
- 当name和course同时传参时,按id分组,统计总分数
- 按name分组,统计相同name的总分数
- 按course分组,统计总分数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
|