理解
mongo聚合类似关系型数据库的分组操作,
mongo聚合操作是一种管道操作,每一步的结果都是下一步的操作的输入。
实例
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 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| Criteria criteria = Criteria.where("orgId").is(formReplyModel.getOrgId()); criteria.and("formId").in(formReplyModel.getFormId()); criteria.and("formName").regex("^.*" + formReplyModel.getFormName() + ".*$");
List<AggregationOperation> operations = new ArrayList<>();
operations.add(Aggregation.match(criteria));
operations.add(Aggregation.group("createrId").count().as("fillCount").max("createdTime").as("LastFillTime").first("staffName").as("staffName").first("createrId").as("userId"));
operations.add(Aggregation.count().as("dataCount"));
Aggregation aggregation = newAggregation(operations);
Integer count = 0;
AggregationResults<Map> aggregationResults = mongoTemplate.aggregate(aggregation, "form_reply", Map.class); List<Map> list = aggregationResults.getMappedResults(); if (CollectionUtil.isNotEmpty(list)) { Map<String,Integer> map = list.get(0); count = (Integer)map.get("dataCount"); }
page.setTotal(count); if (count > 0) { operations.remove(operations.size()-1); operations.add(Aggregation.sort(Sort.by(Sort.Direction.DESC, "LastFillTime"))); if (formReplyModel.getPageNum() != null && formReplyModel.getPageSize() != null) { operations.add(Aggregation.skip((long)(((formReplyModel.getPageNum()) - 1)*formReplyModel.getPageSize()))); operations.add(Aggregation.limit(formReplyModel.getPageSize())); } aggregation = newAggregation(operations); AggregationResults<FormUserSummaryModel> form_reply = mongoTemplate.aggregate(aggregation, "form_reply", FormUserSummaryModel.class); List<FormUserSummaryModel> mappedResults = form_reply.getMappedResults(); page.setRecords(mappedResults); }
|
上面例子执行了两次聚合管道操作,第一次获取数据的件数,第二次获取分页数据;将数据进行分组,然后取分页信息。
先分组,再where,其实也就类似与关系型数据库的group by 后再having
先where,再分组,类似与关系型数据库的 where后再group by