zoukankan      html  css  js  c++  java
  • Java 中 MongoDB 分页查询的总结

    MongoDB 分页查询的总结

    对于 mongodb 数据库,和 mysql 类似,也有自带的分页 api,其实直接调用 api,也可以实现 mongodb 的分页,主要 api 就是两个:

    query.skip((pageNum - 1) * pageSize);
    query.limit(pageSize);
    

    其中:pageNum:当前页,pageSize:页大小

    但是当数据量多了的时候,mongodb 再使用这种方式去做分页,查询效率就会变得很慢,主要原因是 mongodb 自带的这个 skip() 方法的问题,跳跃查询导致虽然做了分页,但还是会使数据查询效率低下。

    主要原理思路:

    条件查询+排序+限制返回记录。
    边查询,边排序,排序之后,抽取第一次分页中的最后一条记录,作为第二次分页的条件,进行条件查询,以此类推…

    假设现在要给一个 Title 类做分页查询,一开始还是传统想法,必须要有“当前页”和“页大小”这两个参数:

    public List<Title> listDesc(int pageNum, int pageSize) {
        List<Title> titleList;
    
        Query query = new Query();
    
        // 通过 _id 来排序
        query.with(Sort.by(Sort.Direction.ASC, "_id"));
    
        if (pageNum != 1) {
            // number 参数是为了查上一页的最后一条数据
            int number = (pageNum - 1) * pageSize;
            query.limit(number);
    
            List<Title> titles = mongoTemplate.find(query, Title.class);
            // 取出最后一条
            Title title = titles.get(titles.size() - 1);
    
            // 取到上一页的最后一条数据 id,当作条件查接下来的数据
            String id = title.get_id();
    
            // 从上一页最后一条开始查(大于不包括这一条)
            query.addCriteria(Criteria.where("_id").gt(id));
        }
        // 页大小重新赋值,覆盖 number 参数
        query.limit(pageSize);
        // 即可得到第n页数据
        titleList = mongoTemplate.find(query, Title.class);
    
        return titleList;
    }
    

    其实就是不要使用 mongodb 自带的 skip() 这个方法,转而使用 sort() 排序和 limit() 限制数据大小这两个方法,通过排序,让数据每次从上一页的最后一条开始起做查询,再限制每次返回的总数据大小即可!

    没有修不好的电脑
  • 相关阅读:
    设计模式详解(图码)
    设计模式详解(图)
    Zookeeper学习
    取消单元格的点击事件
    ios 中生成随机数
    IOS 时间和时间戳之间转化
    偏好存空判断
    限制textfield的文字长度
    tabBar的图标不被系统渲染
    (转)IOS http请求的get 和 post的请求的区别
  • 原文地址:https://www.cnblogs.com/duniqb/p/12702425.html
Copyright © 2011-2022 走看看