做實驗驗證MongoDB分頁的兩種方法

chenfeng發表於2016-04-18
下面是我的測試方法:
> db.chenfeng.save({age:1,name:"duansf"})
WriteResult({ "nInserted" : 1 })
> db.chenfeng.save({age:2,name:"duansf"})
WriteResult({ "nInserted" : 1 })
> db.chenfeng.save({age:3,name:"duansf"})
WriteResult({ "nInserted" : 1 })
> db.chenfeng.save({age:4,name:"duansf"})
WriteResult({ "nInserted" : 1 })
> db.chenfeng.save({age:5,name:"duansf"})
WriteResult({ "nInserted" : 1 })
> db.chenfeng.save({age:6,name:"duansf"})
WriteResult({ "nInserted" : 1 })
> db.chenfeng.find()
{ "_id" : ObjectId("5714419cf7c81959e12a904e"), "age" : 1, "name" : "duansf" }
{ "_id" : ObjectId("571441a3f7c81959e12a904f"), "age" :  2, "name" : "duansf" }
{ "_id" : ObjectId("571441a7f7c81959e12a9050"), "age" : 3, "name" : "duansf" }
{ "_id" : ObjectId("571441abf7c81959e12a9051"), "age" : 4, "name" : "duansf" }
{ "_id" : ObjectId("571442b0f7c81959e12a9052"), "age" : 5, "name" : "duansf" }
{ "_id" : ObjectId("571442bcf7c81959e12a9053"), "age" : 6, "name" : "duansf" }
>


第一種方法
查詢第一頁的資料(按兩條資料為一頁)
> db.chenfeng.find().sort({"age":1}).limit(2);
{ "_id" : ObjectId("5714419cf7c81959e12a904e"), "age" : 1, "name" : "duansf" }
{ "_id" : ObjectId("571441a3f7c81959e12a904f"), "age" : 2, "name" : "duansf" }
>

查詢第二頁的資料:
> db.chenfeng.find().sort({"age":1}).skip(2).limit(2);
{ "_id" : ObjectId("571441a7f7c81959e12a9050"), "age" : 3, "name" : "duansf" }
{ "_id" : ObjectId("571441abf7c81959e12a9051"), "age" : 4, "name" : "duansf" }
>

查詢第三頁的資料:
> db.chenfeng.find().sort({"age":1}).skip(4).limit(4);
{ "_id" : ObjectId("571442b0f7c81959e12a9052"), "age" : 5, "name" : "duansf" }
{ "_id" : ObjectId("571442bcf7c81959e12a9053"), "age" : 6, "name" : "duansf" }
>


第二種方法:
查詢第一頁的資料:
> db.chenfeng.find().sort({"age":1}).limit(2);
{ "_id" : ObjectId("5714419cf7c81959e12a904e"), "age" : 1, "name" : "duansf" }
{ "_id" : ObjectId("571441a3f7c81959e12a904f"), "age" : 2, "name" : "duansf" }
>


查詢第二頁和第三頁的資料:
> var c1=db.chenfeng.find().sort({"age":1}).limit(2);
> var latest=null;
> while(c1.hasNext()){
... latest=c1.next();
... }
{
        "_id" : ObjectId("571441a3f7c81959e12a904f"),
        "age" : 2,
        "name" : "duansf"
}
> db.chenfeng.find({"age":{"$gt":latest.age}}).sort({"age":1}).limit(2);
{ "_id" : ObjectId("571441a7f7c81959e12a9050"), "age" : 3, "name" : "duansf" }
{ "_id" : ObjectId("571441abf7c81959e12a9051"), "age" : 4, "name" : "duansf" }

> db.chenfeng.find({"age":{"$gt":latest.age}}).sort({"age":1}).limit(4);
{ "_id" : ObjectId("571441a7f7c81959e12a9050"), "age" : 3, "name" : "duansf" }
{ "_id" : ObjectId("571441abf7c81959e12a9051"), "age" : 4, "name" : "duansf" }
{ "_id" : ObjectId("571442b0f7c81959e12a9052"), "age" : 5, "name" : "duansf" }
{ "_id" : ObjectId("571442bcf7c81959e12a9053"), "age" : 6, "name" : "duansf" }
>


總結來說,如果資料量不是很大的話,可以使用第一種方法,畢竟比較簡單,如果資料量比較大的話,使用第二種方法比較好,
因為這樣就可以不用到skip()這個函式,skip跳過太多的記錄,效率有點低

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15498/viewspace-2083154/,如需轉載,請註明出處,否則將追究法律責任。

相關文章