zoukankan      html  css  js  c++  java
  • mongodb查询分页优化

    要求不用skip

    前提:1.时间倒序排列(自己现在的项目中也是按照时间倒序排列的)
          2.每页显示10条数据

    int limit = 10;//刚开始点击查询的时候设置十条
    查询形式为 db.find(query).sort(time,-1).limit(limit)方式

    注:query是查询条件,其中包括了时间段的条件,例如 a=<time<=b的限制

    1)记录每一页的第一条数据的时间firstTime
    2)记录每一页最后一条数据的时间lastTime

        
        在查询之前判断用户是点击下一页还是上一页,在这里用clickPrePage的值是否为空来判断是否点击上一页
    同理用clickNextPage的值是否为空来判断是否点击下一页
        
        //逻辑代码如下   
        if(notEmpty(clickPrePage){//点击上一页
           limit = clickPrePage*10;
           查询条件的时间条件设置为>=firstTime     
        }//end if
        
        if(notEmpty(clickNextPage){//点击下一页
            limit = clickNextPage * 10;
            查询条件的时间条件设置为<=lastTime
        }//end if
     

    代码说明:
       比如当前页是第5页,当点击第4页的时候,由于每页要显示十条,所以按照上面的逻辑limit=40,也就是查询40条,取后十条记录显示即可
       同理,当点击第6页的时候。此时limit=60,查询60条,取最后十条显示
       当然,当用户输入跳转的时候同样的逻辑,比如当前页还是取第五页为例,此时用户要跳转到第100页,那么此时limit=1000,取最后10条显示即可

    由于每页显示10条数据,需要从查询的结果中获取10条,所以while循环可以这么写

    int index=0;

    while(cursor.hasNext()&index<limit){//确保循环十次,让集合list的size=10,把list传到前台,来达到每页显示十条数据的目的

        int i = limit-index;
        
       //查询结果放入集合list中,要取查询结果的后10条
       if(i<10){   
       
         //记录每页第一条数据的时间
          if(i==9){
            fistTime = db.get("time").toString();
          }
          
          //记录每页最后一条数据的时间
          if(i==0){    
              lastTime = db.get("time").toString();
          }
          list.add(cursor.hasNext().next());
       }//end if
       
        index++;  
        
    }//end while

    缺点:
      在跨页跳转时由于不能确定要跳转的页面的前一页的lastTime,所以根据前面设定的limit,需要查询一些不必要的数据,  然后从这些数据取后10条也就是需要的数据来显示,效率上仍有些欠缺。
        比如:当前页为currentPage,记录此页的lastTime假设为a,要跳转到currentPage+100页,需要根据currentPage的lastTime来作为查询条件,而没法获取currengPage+99页的数据的lastTime来进一步缩小查询范围.
     

    未完待续

    以上方法有不当之处,欢迎批评指正,如果好的方法,希望能交流一下

  • 相关阅读:
    gw经销商上传部分代码
    lib
    【转】sql server的随机函数newID()和RAND()
    【源码】仿qq记住登录信息
    关于ConfigurationManager类
    oracle 10 协议适配器错误解决办法
    配置对象数据源时,无法找到业务对象的解决办法
    private的由来,让能你很容易地区分private与protected的用法!
    大树扎根不稳,缘何不倒?
    Html服务器控件常用属性InnerHtml属性及InnerText属性的区别
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3310598.html
Copyright © 2011-2022 走看看