Java使用MongoTemplate分页查询MongoDB

Java使用MongoTemplate分页查询MongoDB,如有问题请指正。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.mongodb</groupId>
            <artifactId>mongodb-driver</artifactId>
        </exclusion>
    </exclusions>
</dependency>

如果是MongoDB最新版本则需要改变 spring boot 版本 否则会出现版本兼容问题,如下图:


具体实现:

@Autowired
private MongoTemplate mongoTemplate;

/**
 * 根据条件分页获取请求日志信息
 *
 * @param pageIndex
 * @param pageSize
 * @param sTime
 * @param eTime
 * @param address
 * @return
 * @throws Exception
 */
@Override
public PageModel<HttpInboundLog> findLogPage(Integer pageIndex, Integer pageSize,
                                             String sTime, String eTime, String address) throws Exception {

    PageModel<HttpInboundLog> pageable = new PageModel<HttpInboundLog>();
    List<HttpInboundLog> logList = new ArrayList<HttpInboundLog>();
    if (null == pageIndex || pageIndex == 0) {
        pageIndex = 1;
    }
    if (null == pageSize || pageSize == null) {
        pageSize = 10;
    }
    try {
        List<AggregationOperation> operations = new ArrayList<>();
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        if (null != sTime && !sTime.equals("")) {
            Criteria criteria = Criteria.where("requestTime").gt(formatter.parse(sTime));
            operations.add(Aggregation.match(criteria));
        }
        if (null != eTime && !eTime.equals("")) {
            Criteria criteria = Criteria.where("requestTime").lt(formatter.parse(eTime));
            operations.add(Aggregation.match(criteria));
        }
        if (null != address && !address.equals("")) {
            Criteria criteria = Criteria.where("url").regex(address);
            operations.add(Aggregation.match(criteria));
        }
        //使用skip 跳过数据,如果数据量庞大则影响性能问题
        operations.add(Aggregation.skip((long) (pageIndex - 1) * pageSize));
        operations.add(Aggregation.limit(pageSize));
        operations.add(Aggregation.lookup("doc_category", "categoryCode", "code", "category"));
        operations.add(Aggregation.sort(Sort.Direction.DESC, "requestTime"));
        //operations.add(Aggregation.group("requestTime","url","requestNo","responseBody")); 指定返回字段
        Aggregation aggregation = Aggregation.newAggregation(operations);
        AggregationResults<HttpInboundLog> results = mongoTemplate.aggregate(
            aggregation, "httpInboundLog", HttpInboundLog.class);
        logList = results.getMappedResults();
        pageable.setPageSize(pageSize);
        pageable.setRow(this.findLogCount(sTime,eTime,address));//查询出符合条件总数
        pageable.setResult(logList);
        return pageable;
    } catch (Exception e) {
        e.printStackTrace();
        LOG.error("code:500------msg:分页查询MongoDB中请求日志失败");
        throw new RuntimeErrorCode(500, "分页查询MongoDB中请求日志失败");
    }
}

/**
 * 查询符合条件总条数
 * @param sTime
 * @param eTime
 * @param address
 * @return
 * @throws Exception
 */
public long findLogCount(String sTime, String eTime, String address) throws Exception {
    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    Query query = new Query();
    if (null != sTime && !sTime.equals("")) {
        Criteria criteria = Criteria.where("requestTime").gt(formatter.parse(sTime));
        query.addCriteria(criteria);
    }
    if (null != eTime && !eTime.equals("")) {
        Criteria criteria = Criteria.where("requestTime").lt(formatter.parse(eTime));
        query.addCriteria(criteria);
    }
    if (null != address && !address.equals("")) {
        Criteria criteria = Criteria.where("url").regex(address);
        query.addCriteria(criteria);
    }
    long count = mongoTemplate.count(query, HttpInboundLog.class);


    return count;
}

pagemodel 封装类

@Data
public class PageModel<T> {
    private int pageIndex;//当前页
    private long row;//记录数
    private int pageSize;//每页显示条数
    private List<T> result;//结果集

    /**
     * 获取总页数
     *
     * @return
     */
    public int getPages() {
        return ((int) row + pageSize - 1) / pageSize;
    }
    /**
     * 取得首页
     * @return
     */
    public int getTopPageNo(){
        return 1;
    }
    /**
     * 上一页
     * @return
     */
    public int getPreviousPageNo(){
        if(pageIndex<=1){
            return 1;
        }
        return pageIndex-1;
    }
    /**
     * 下一页
     * @return
     */
    public int getNextPageNo(){
        if(pageIndex>=getBottomPageNo()){
            return getBottomPageNo();
        }
        return pageIndex+1;
    }
    /**
     * 取得尾页
     * @return
     */
    public int getBottomPageNo(){
        return getPages();
    }


转载请注明出处。。。。。。



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的MongoDB分页查询工具类的实现,使用MongoTemplate和PageRequest: ```java import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Sort; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; public class MongoPageUtils<T> { /** * 分页查询 * @param mongoTemplate mongoTemplate实例 * @param collectionName 集合名称 * @param pageNo 页号 * @param pageSize 每页大小 * @param sortField 排序字段 * @param sortOrder 排序方式 * @param query 查询条件 * @param clazz 返回结果类型 * @return 分页结果 */ public Page<T> findPage(MongoTemplate mongoTemplate, String collectionName, int pageNo, int pageSize, String sortField, Sort.Direction sortOrder, Query query, Class<T> clazz) { // 分页查询条件 PageRequest pageRequest = PageRequest.of(pageNo - 1, pageSize, sortOrder, sortField); // 查询总记录数 long totalCount = mongoTemplate.count(query, clazz, collectionName); // 分页查询 query.with(pageRequest); // 执行查询 return new PageImpl<>(mongoTemplate.find(query, clazz, collectionName), pageRequest, totalCount); } /** * 分页查询 * @param mongoTemplate mongoTemplate实例 * @param collectionName 集合名称 * @param pageNo 页号 * @param pageSize 每页大小 * @param sortField 排序字段 * @param sortOrder 排序方式 * @param criteria 查询条件 * @param clazz 返回结果类型 * @return 分页结果 */ public Page<T> findPage(MongoTemplate mongoTemplate, String collectionName, int pageNo, int pageSize, String sortField, Sort.Direction sortOrder, Criteria criteria, Class<T> clazz) { // 查询条件 Query query = new Query(criteria); // 分页查询 return findPage(mongoTemplate, collectionName, pageNo, pageSize, sortField, sortOrder, query, clazz); } } ``` 使用方法: ```java MongoPageUtils<User> pageUtils = new MongoPageUtils<>(); // 查询条件 Criteria criteria = Criteria.where("age").gt(18); // 排序条件 Sort sort = Sort.by(Sort.Direction.DESC, "createTime"); // 分页查询 Page<User> page = pageUtils.findPage(mongoTemplate, "user", 1, 10, "createTime", sort.getDirection(), criteria, User.class); // 获取分页结果 List<User> userList = page.getContent(); ``` 其中,MongoTemplate是Spring提供的操作MongoDB的工具类,可以在项目启动时进行注入。对于查询条件和排序条件,可以使用Criteria和Sort类进行构造。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值