mongodb查詢分頁優化
阿新 • • 發佈:2019-02-01
要求不用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來進一步縮小查詢範圍.
前提: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來進一步縮小查詢範圍.
未完待續
以上方法有不當之處,歡迎批評指正,如果好的方法,希望能交流一下