1. 程式人生 > >mongodb查詢分頁優化

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來進一步縮小查詢範圍.
 

未完待續

以上方法有不當之處,歡迎批評指正,如果好的方法,希望能交流一下