Java中使用MongoDB聚合查询,涉及分页,分组,去重
做一下相关总结,本次是单表查询统计分析,下面做一下简单的使用过程
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>3.4.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
需求分析
查询每个人服务了多少家企业以及服务的总次数
假设用sql语句:
select
user_id,
count(distinct com_id) as comNum,
sum(server_num) as serverNums
from user_server_record
group by user_id
用mongodb分组查询分页
---------------
@Autowired
private MongoTemplate mongoTemplate;
---------------
List<Long> userIds = countVo.getUserIds();
Criteria criteria = new Criteria();
criteria.and("user_id").in(userIds);
Aggregation aggregation = Aggregation.newAggregation(
Aggregation.match(criteria),
Aggregation.group("user_id", "com_id").first("user_id").as("userId")
.first("name").as("name")
.first("dept_names").as("deptName")
.sum("server_nums").as("serverNums"),
Aggregation.group("userId").first("userId").as("userId")
.first("name").as("name")
.first("deptName").as("deptName")
.count().as("comNums")
.sum("serverNums").as("serverNums"),
Aggregation.skip(countVo.getPageNum()>1?(countVo.getPageNum()-1)*countVo.getPageSize():0),
Aggregation.limit(countVo.getPageSize()),
Aggregation.sort(Sort.by(Sort.Order.desc("serverNums"),Sort.Order.desc("comNums")))
);
Aggregation aggregation1 = Aggregation.newAggregation(
Aggregation.match(criteria),
Aggregation.group("user_id").first("user_id").as("userId")
.first("name").as("name")
.first("dept_names").as("deptName")
.sum("server_nums").as("serverNums")
);
int total = mongoTemplate.aggregate(aggregation1, mongoTemplate.getCollectionName(MongoCountServerNums.class), CountMainNumVo.class).getMappedResults().size();
AggregationResults<CountMainNumVo> results = mongoTemplate.aggregate(aggregation, mongoTemplate.getCollectionName(MongoCountServerNums.class), CountMainNumVo.class);
List<CountMainNumVo> result = results.getMappedResults();
Map<String, Object> m = new HashMap<String, Object>();
m.put("rows", result);
m.put("pageNum", countMainVo.getPageNum());
m.put("total", total);
普通列表查询分页
---------------
@Autowired
private MongoTemplate mongoTemplate;
---------------
..........
List<Long> userIds = countVo.getUserIds();
Criteria criteria = new Criteria();
criteria.and("user_id").in(userIds);
criteria.and("server_num").gt(0);
Query query = new Query(criteria);
int total = mongoTemplate.find(query, MongoCountServerNums.class).size();
PageDomain pageDomain = TableSupport.buildPageRequest();
Integer pageNum = pageDomain.getPageNum();
Integer pageSize = pageDomain.getPageSize();
if (pageNum == null) pageNum = 1;
if (pageSize == null) pageSize = 10;
Pageable pageable = PageRequest.of(pageNum - 1, pageSize, Sort.by(Sort.Order.desc("create_date")));
query.with(pageable);
List<MongoCountServerNums> resultLit = mongoTemplate.find(query, MongoCountServerNums.class);
Map<String, Object> m = new HashMap<String, Object>();
m.put("rows", resultLit);
m.put("pageNum", pageNum);
m.put("total", total);
.............