mongodb 优化分页做法

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

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

(nowPage:当前页,pageSize:页大小)

但是当数据量多了的时候,mongodb 再使用这种方式去做分页,查询效率就会变得很慢,主要原因是 mongodb 自带的这个 skip() 方法的问题,跳跃查询导致虽然做了分页,但还是会使数据查询效率低下,网上找了很多方法,都是说通过“排序,限制数量”的方式来做,看了很多例子,都写的比较复杂,不费点心思去认真看,真的越看越懵,最后还是根据网上提供的思路,自己琢磨出来了比较简单易懂的写法。

主要原理思路: 

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

认真理解了这个原理之后,后面的其实也不难做:

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

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

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

转载于:https://www.cnblogs.com/xuehuashanghe/p/10483173.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值