springboot mongo自带分页使用,聚合与单表查询

该博客介绍了如何在SpringBoot中使用MongoTemplate进行自定义分页查询,以解决Example方式分页的局限性问题。MongoPageUtil工具类提供了一个通用的分页查询方法,支持常规查询和聚合查询。调用方示例展示了如何结合自定义参数进行分页查询操作。
摘要由CSDN通过智能技术生成

由于springboot mongo自带的分页只能使用Example方式,但是Example方式用不好,局限性大,习惯使用mongoTemplate方式

本工具调用springboot mongo自带的分页

MongoPageUtil
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.repository.support.PageableExecutionUtils;

import java.util.List;

/**
 * @author liaozesong
 */
public class MongoPageUtil {
    /**
     * 分页查询封装
     *
     * @param query         查询条件
     * @param pageable      分页参数
     * @param clazz         表对象
     * @param mongoTemplate mongo处理模板
     * @return 查询分页后数据
     */
    public static <T> Page<T> findPage(Query query, Pageable pageable, Class<T> clazz, MongoTemplate mongoTemplate) {
        query.with(pageable);
        List<T> list = mongoTemplate.find(query, clazz);
        return PageableExecutionUtils.getPage(list, pageable,
                () -> mongoTemplate.count(Query.of(query).limit(-1).skip(-1), clazz));
    }
        /**
     * 聚合分页查询封装
     *
     * @param operations    聚合条件
     * @param pageable      分页参数
     * @param clazz         表对象
     * @param mongoTemplate mongo处理模板
     * @return 查询分页后数据
     */
    public static <T> Page<T> findPage(List<AggregationOperation> operations, Pageable pageable, Class<T> clazz, MongoTemplate mongoTemplate) {
        SkipOperation skip = Aggregation.skip(pageable.getOffset());
        LimitOperation limit = Aggregation.limit(pageable.getPageSize());
        CountOperation total = Aggregation.count().as("total");

        operations.add(skip);
        operations.add(limit);
        List<T> list = mongoTemplate.aggregate(Aggregation.newAggregation(operations), clazz, clazz).getMappedResults();
        return PageableExecutionUtils.getPage(list, pageable, () -> {
            operations.remove(skip);
            operations.remove(limit);
            operations.add(total);
            HashMap<String, Long> map = mongoTemplate.aggregate(Aggregation.newAggregation(operations), clazz, HashMap.class).getMappedResults().get(0);
            return map.get("total");
        });
    }
}
调用方
public Page<DataTrack> selectPage(TrackParam param) {
    String beginDate = param.getBeginDate();
    String endDate = param.getEndDate();
    String lineId = param.getLineId();

    Criteria criteria = Criteria
            .where("lid").is(lineId)
            .and("startTimestamp")
            .gte(DateUtil.parse(beginDate).getTime())
            .lte(DateUtil.parse(endDate).getTime());

    Query query = Query.query(criteria);

    return MongoPageUtil.findPage(query, param.genPageable(), DataTrack.class, mongoTemplate);
}
page入参
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;

/**
 * 分页参数
 *
 * @author liaozesong
 */
@Data
public class PageParam {
    @ApiModelProperty(value = "页码", required = true, example = "1")
    private Integer pageNo;
    @ApiModelProperty(value = "每页条数", required = true, example = "5")
    private Integer pageSize;

    public Pageable genPageable() {
        return PageRequest.of(getPageNo() - 1, getPageSize());
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值