mongo分组分页查询

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;
}

猜你喜欢

转载自blog.csdn.net/zhangxue_wei/article/details/103735416