使用MongoDB快速分页

本文涉及的产品
云数据库 MongoDB,通用型 2核4GB
简介:

英文原文:

http://blog.mongodirector.com/fast-paging-with-mongodb/

 

通过你的数据分页是使用MongoDB最常用操作之一。典型的案例是需要在你的UI的表格中显示结果。如果你正在批处理数据,分页策略正确是很重要的,以致你的数据处理可扩展。

 

让我们通过一个示例来看看在MongoDB中通过数据分页的不同方法。在这个示例中,我们有一个用户数据库CRM,我们需要分页并一次显示10个用户。因此我们的分页大小是10.这是我们的用户文档结构:

1
2
3
4
5
6
{
_id,
name,
company,
state
}

 

方法1:使用skip()和limit()

 

MongoDB本地支持使用skip()和limit()命令的分页操作。skip(n)命令告诉MongoDB跳过n条结果,limit(n)命令告诉MongoDB限制结果长度为“n”个结果。典型地你会通过游标使用skip()和limit()命令 – 但是为了描述这个案例我们提供了控制台命令来完成相同的结果。因为代码的简洁性,也排除了检查代码的限制。

1
2
3
4
5
6
7
//Page  1
db. users . find ().limit (10)
//Page  2
db. users . find ().skip(10).limit(10)
//Page  3
db. users . find ().skip(20).limit(10)
........

你明白了。通常获取第n页的代码像这样:

1
db. users . find ().skip(pagesize*(n-1)).limit(pagesize)

然而随着数据大小的增长,该方法有严重的性能问题。原因是每次查询执行时,完整的结果集被构建,然后实例必须从集合的开始定位到特定的偏移位置。因为你的偏移增加,这个过程变得越来越慢。这个过程也不能有效利用索引。因此典型地“skip()”和“limit()”方法对于小的数据集时是有效的。如果你使用大数据集,你需要考虑其他方法。

 

方法2:使用find()和limit()

 

之前的方法扩展得不是很好的原因是skip()命令。因此这部分的目标是不使用“skip()”命令执行分页。我们使用时间戳或文档中的id以自然顺序存储数据。在这个示例中,我们使用存储在每个文档中的“_id”。“_id”是一个MongoDB的ObjectID结构,是一个12字节的结构,包含时间戳、机器、进程ID、计数器等。整体想法如下:

1. 获取当前页最后文档的_id

2. 获取大于该“_id”的下一页的文档


1
2
3
4
5
6
7
8
//Page  1
db. users . find ().limit(pageSize);
//Find  the  id  of the last document  in  this page
last_id = ...
//Page  2
users  = db. users . find ({ '_id' > last_id}). limit(10);
//Update  the last  id  with the  id  of the last document  in  this page
last_id = ...


该方法保持了存在于“_id”列中的固有顺序。也因为“_id”列默认被索引,查找性能非常好。如果你正使用的列没有被索引,你的性能将会变差 -- 因此确保该列有索引是很重要的。


如果你也想为你的分页以特定顺序排列数据,你可以用以上技术使用sort()从句。确保排序过程覆盖索引获得最佳性能非常重要。你可以使用.explain后缀到你的查询去决定。

1
2
3
users  = db. users . find ({ '_id' > last_id}).  sort (..).limit(10);
//Update  the last  id  with the  id  of the last document  in  this page
last_id = ...


一如既往如果你有任何问题或者评论请随时联系我们support@mongodirector.com













本文转自UltraSQL51CTO博客,原文链接:http://blog.51cto.com/ultrasql/1740517 ,如需转载请自行联系原作者



相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。   相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
监控 NoSQL 前端开发
软件测试|Mongodb的分页优化及索引使用
软件测试|Mongodb的分页优化及索引使用
378 0
软件测试|Mongodb的分页优化及索引使用
|
JSON NoSQL 关系型数据库
MongoDB(一)——增删改查,排序分页,索引,权限机制
数据库就是用来存放数据的仓库 关系型和非关系型数据库软件的项目数据 相同点:都是数据库软件,用来存放项目数据
400 0
MongoDB(一)——增删改查,排序分页,索引,权限机制
|
存储 JSON NoSQL
MongoDB基本操作(二)——排序、分页、聚合查询、优化索引等
MongoDB基本操作(二)——排序、分页、聚合查询、优化索引等
1264 0
|
SQL NoSQL 搜索推荐
上亿数据怎么玩深度分页?兼容MySQL + ES + MongoDB
没工夫分库分表,如何快速实现深度分页~
1975 0
上亿数据怎么玩深度分页?兼容MySQL + ES + MongoDB
|
JSON NoSQL JavaScript
NodeJs操作MongoDB之分页功能与常见问题
NodeJs操作MongoDB之分页功能与常见问题一,方法介绍 1,聚合操作之count count()方法可以查询统计符合条件的集合的总数 1 db.User.count() // 此方法等价于 db.User.find().count()在分布式集合中,会出现计算错误的情况,这个时候推荐使用aggregate; 2,find() 方法以非结构化的方式来显示所有文档。
1702 0
|
NoSQL 前端开发 MongoDB
Node MongoDB查询列表带分页
前端需要的数据结构 { "code": "0000", "desc": "OK", "body":{ "page_no": 1,//当前第几页 ...
1465 0
|
NoSQL Java 索引
MongoDB分页的Java实现和分页需求的思考
前言 传统关系数据库中都提供了基于row number的分页功能,切换MongoDB后,想要实现分页,则需要修改一下思路。 传统分页思路 假设一页大小为10条。则 //page 1 1-10 //page 2 11-20 //page 3 21-30 ... //page n 10*(n-1) +1 - 10*n MongoDB提供了skip()和limit()方法。
1690 0
|
NoSQL MongoDB 数据库
转MongoDB 使用Skip和limit分页
关于MongoDB 数据分页和排序 limit,skip用户的一些基础语句,介绍MongoDB 数据分页和排序实例方法。 使用Skip和limit可以如下做数据分页: Code:    page1 = db.
1331 0
|
NoSQL 关系型数据库 数据库
2.非关系型数据库(Nosql)之mongodb:mongodb显示所有数据库,使用数据库,集合创建(显示和隐式创建),集合查询,初步数据的增删改查,分页
 1代开一个cmd窗口,当作mongodb客户端,执行以下命令: mongo localhost:27017 2查看所有的数据库: > show dbs; admin (empty) local 0.078GB 3 db命令,查看当前窗口在那个数据库下面(test数据库没有任何数据,在内存里面):
1281 0