`
vanadiumlin
  • 浏览: 490760 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

MongoDB不使用skip做分页

 
阅读更多

mysql  可以借鉴的思想

MongoDB不使用skip做分页

使用Skip和limit可以如下做数据分页:

Code: page1 = db.things.find().limit(20)
page2 = db.things.find().skip(20).limit(20)
page3 = db.things.find().skip(40).limit(20)

当数据量很小时,这样做分页完全没有问题。但是当数据量很大时,skip操作会变的很慢,应该避免使用。(不止是mongoDb会这样,大部分数据库都是。)可以通过改变查询文档的规则来达到分页效果,避免使用skip来跳过大量的数据。(通过计算,得到下次查询应该从什么地方开始)

以下演示如何通过改变查询规则来避免使用skip。如果有以下数据:

Code: {'date':'2011-07-05 09:53:00'}
{'date':'2011-07-05 09:53:01'}
{'date':'2011-07-05 09:53:02'}
...
{'date':'2011-07-05 09:54:00'}

则数据库的第一页可以这样获得:

Code: page1 = db.xx.find().sort('date',1).limit(10)

然后通过遍历,展示,并且获得最后一个数据:

Code: var latest = null;

while (page1.hasNext()) {
   latest = page1.next();
   display(latest);
}

现在,通过获得的最后一个日期的数据,可以做下一个查询:

Code: var page2 = db.xx.find({"date" : {"$gt" : latest.date}});
page2.sort({"date" : 1}).limit(10);

以次类推,可以一直获得到最后一个的分页。

当然,这里展示的只是一个理想的情况,事实上,可能分页的时候,有很多值的数值都是一样的,例如:

Code: {'date':'2011-07-05 09:53:00'}
{'date':'2011-07-05 09:53:01'}
{'date':'2011-07-05 09:53:01'}
{'date':'2011-07-05 09:53:01'}
{'date':'2011-07-05 09:53:01'}
{'date':'2011-07-05 09:53:01'}

{'date':'2011-07-05 09:53:02'}
{'date':'2011-07-05 09:53:03'}
{'date':'2011-07-05 09:53:04'}
...
{'date':'2011-07-05 09:54:00'}

在这个例子中,如果第一个分页落在{'date':'2011-07-05 09:53:01'}附近的话,就会有5条重复的(极端情况下,可能有非常多,例如好几百条一样的键值),这样在调用{"$gt" : latest.date}时,可能会把上一页的尾数据也给包含进来了。在这种情况下,就需要使用一些别的field来辅助分页,或者转回采用skip,或者如果你的分页不是特别的严格,可以忽略这种情况。(例如mop,天涯首页那种,每页有好几百页帖子,每一秒每一页都不一样。)

 

用where+limt是最快的
mongo是用skip翻页,这个非常慢

分享到:
评论
2 楼 eimsteim 2013-08-02  
根据你的描述,要显示当前页,必须知道上一页的最后一条数据,请问楼主,如果用户直接点击第5页,你如何获取第4页的最后一条数据?
1 楼 helloqidi 2012-02-15  
谢谢,很有帮助!

相关推荐

    高效mongodb的php分页类(不使用skip).zip

    介绍了高效mongodb的php分页类,并且没有使用mongodb的skip来实现分页,需要的朋友可以参考下,mongodb分页skip limit分页要先查出所有结果再去跳过,这样如果查询页面越往后效率越低。 如果能够通过查询条件查出...

    高效mongodb的php分页类(不使用skip)

    主要介绍了高效mongodb的php分页类,并且没有使用mongodb的skip来实现分页,需要的朋友可以参考下

    MongoDB 使用Skip和limit分页

    使用Skip和limit可以如下做数据分页: Code: page1 = db.things.find().limit(20) page2 = db.things.find().skip(20).limit(20) page3 = db.things.find().skip(40).limit(20)  备注:可用于分页,limit是...

    基于c#的Mongodb帮助类源码 含一个分页效率测试

    基于c#的Mongodb数据库的增删改查的帮助类,并且里面有一个Skip-Limit分页与Where-Limit分页的效率对比

    spring-data集成mongodb大数据量分页+自增id实现+MongodbPlugin集成

    skip随着数据量上去,分页性能极具下降,不推荐。这里使用spring-data-mongo实现的分页,并且实现了mongodb自增id(监听器方式)、也集成了轻量级插件MongodbPlugin,有需要的可以下载看看哦~

    mongoDB实现分页的方法

    mongoDB的分页查询是通过limit(),skip(),sort()这三个函数组合进行分页查询的。 下面这个是我的测试数据 db.test.find().sort({“age”:1}); 第一种方法 查询第一页的数据:db.test.find().sort({“age”:1}).limit...

    mongoDB分页的两种方法(图例)

    mongoDB分页的两种方法,mongoDB的分页查询是通过limit(),skip(),sort()这三个函数组合进行分页查询的。

    mongoose-range-paginate:MongoDb Mongoose 分页正确完成

    使用范围分页的实用函数,比使用skip()快得多。 安装 $ npm install mongoose-range-paginate 例子 var paginate = require ( 'mongoose-range-paginate' ) . . . // use any field name in your model, in this ...

    深入云计算 MongoDB管理与开发实战详解pdf.part1

    注重实战,通过实际中的案例为读者讲解使用MongoDB时遇到的各种问题,并给出了解决方案。本书旨在帮助云计算初学者迅速掌握MongoDB数据库,提升读者在云计算实践中的应用和开发能力。同时本书极强的系统性和大量翔实...

    《10天掌握MongoDB》2012完整版.pdf[带书签]

    排序分页-不使用SKIP分页 结束语 第四天:使用索引 创建索引 修改索引 删除索引 唯一索引 地理空间索引-创建1 地理空间索引-创建2 地理空间索引-$NEAR 地理空间索引-$WITHIN(BOX) 地理空间索引-$WITHIN(CENTER) 地理...

    使用 Node.js 和 MongoDB 的查询性能优化案例,代码中添加了注释.js

    mongodb查询性能 在这个案例中,我们首先使用 ...同时,还可以通过其他方式来进一步优化查询性能,例如使用 projection 选项限制返回的字段、使用 sort 选项排序查询结果、使用 skip 和 limit 选项分页查询等。

    MongoDB中方法limit和skip的使用

    在web开发过程中,我们肯定会遇到分页功能,如果是mysql我们主要是利用他的limit和offset语法,那么mongodb有类似的功能吗,答案是肯定的,mongodb有对应的limit和skip方法 下面话不多说了,来一起看看详细的使用...

    MongoDB快速翻页的方法

    翻阅数据是MongoDB最常见的操作之一。一个典型的场景是需要在你的用户界面中显示你的结果。如果你是批量处理的数据,同样重要的是要让你的分页策略正确,以便你的数据处理...MongoDB本身支持分页操作使用 skip() 和 li

    深入云计算 MongoDB管理与开发实战详解pdf.part2

    注重实战,通过实际中的案例为读者讲解使用MongoDB时遇到的各种问题,并给出了解决方案。本书旨在帮助云计算初学者迅速掌握MongoDB数据库,提升读者在云计算实践中的应用和开发能力。同时本书极强的系统性和大量翔实...

    mongoose-paginate:猫鼬分页

    Build to avoid usage of cursor.skip in mongodb The cursor.skip() method is often expensive because it requires the server to walk from the beginning of the collection or index to get the offset or ...

Global site tag (gtag.js) - Google Analytics