mongo分组分页查询
@Autowired
MongoTemplate mongoTemplate;
@Autowired
BasicRepository basicRepository;
//根据企业名称查询舆情列表(分页查询)
public PagerResult<ArticleItem> queryArticleBySearch(ArticleInfoSearch articleInfoSearch){
//查询企业关键字
Basic basic = basicRepository.findBasicByEntName(articleInfoSearch.getEntName());
//返回结果
List<ArticleItem> articleItems = new ArrayList<>();
//统计总条数
List<ArticleItem> countResults = new ArrayList<>();
if (basic != null && basic.getKeywords() != null){
//拼条件
Criteria criteria = new Criteria();
criteria.and("keywords").in(basic.getKeywords());
//是否只看负面
Boolean isNegative = articleInfoSearch.getIsNegative();
if (isNegative != null && isNegative){
criteria.and("kind").is("negative");
}
//开始时间结束时间
String startTime = articleInfoSearch.getStartTime();
String endTime = articleInfoSearch.getEndTime();
//开始时间
if (startTime != null && endTime != null && !startTime.equals("") && !endTime.equals("")){
//大于等于小于等于
criteria.and("publishTime").gte(startTime).lte(endTime);
}else if (startTime != null && !startTime.equals("")){
//大于等于
criteria.and("publishTime").gte(startTime);
}else if (endTime != null && !endTime.equals("")) {
//小于等于
criteria.and("publishTime").lte(endTime);
}
//未聚类的数据不统计,未聚类的groupId为- ,ne 不等于
criteria.and("groupId").exists(true).ne("-");
//分组查询得到groupId和数量
List<AggregationOperation> operations = new ArrayList<>();
operations.add(Aggregation.match(criteria));
operations.add(Aggregation.group("groupId")
.count().as("reportCount")
.first("groupId").as("groupId")
.first("publishTime").as("publishTime")
.first("kind").as("kind")
.first("title").as("title")
.first("href").as("href")
);
//执行分页之前取总条数
Aggregation aggregationStart = Aggregation.newAggregation(operations);
List<ArticleItem> mappedResults = mongoTemplate.aggregate(aggregationStart, "article", ArticleItem.class).getMappedResults();
if (mappedResults != null){
countResults = mappedResults;
}
//排序
operations.add(new SortOperation(new Sort(Sort.Direction.DESC, "publishTime")));
//分页
long curPage = articleInfoSearch.getCurPage();
long pageSize = articleInfoSearch.getPageSize();
operations.add(Aggregation.skip((curPage-1)*pageSize));
operations.add(Aggregation.limit(pageSize));
//分页之后查询
Aggregation aggregation = Aggregation.newAggregation(operations);
articleItems = mongoTemplate.aggregate(aggregation, "article", ArticleItem.class).getMappedResults();
}
return new PagerResult<>(countResults.size(),articleItems);
}
然后通过分组id查询每个组的列表
//通过组织id获取舆情列表
public List<ArticleItem> queryArticleByGroupId(String groupId){
//条件
Query query = new Query();
Criteria criteria = new Criteria();
criteria.and("groupId").is(groupId);
query.with(new Sort(Sort.Direction.DESC, "publishTime"));
query.addCriteria(criteria);
List<Article> articles = mongoTemplate.find(query, Article.class);
List<ArticleItem> articleItems = BeansUtil.convert(articles, ArticleItem.class);
return articleItems;
}