接下来,让我们通过一个例子来看在MongoDB中翻阅数据的不同办法。在这个例子中,我们有一个CRM数据库的用户数据,我们须要通过翻阅浏览和在同一韶光显示10个用户。以是实际上,我们的页面大小是10。下方是我们的用户文档的构造:
{ _id, name, company, state}
方法一:Using skip 和 limit
MongoDB本身支持分页操作利用 skip 和 limit 指令。skip(n)指令见告MongoDB,它该当跳过“n”结果和limit(n)指令指示MongoDB,它该当限定结果长度为“n”结果。常日情形下,你将利用 skip 和 limit 指令,但为相识释情形,我们供应了掌握台命令,这样也能达到相同的结果。同时,为了代码比较简洁,限定检讨代码被打消在外。

//Page 1db.users.find.limit (10)//Page 2db.users.find.skip(10).limit(10)//Page 3db.users.find.skip(20).limit(10)........
一样平常来说,检索页面n,代码是这样的:
db.users.find.skip(pagesize(n-1)).limit(pagesize)
然而,随着数据的大小增加,这种方法涌现严重的性能问题。其缘故原由是在每次实行查询时,建立了完全的结果集,那么做事器必须从网络的开始走到指定的偏移量。当偏移量增加时,这一过程会变得越来越慢。同时,这个过程没有有效地利用索引。以是,当你有较小的数据集时,范例的“skip ”和“ limit ”的方法是有用的。如果您正在利用大数据集,您须要考虑其他方法。
方法二:Using find 和limit
以前的方法不能很好扩展其缘故原由是skip 命令。因此,本节的目标是实现分页不该用skip命令。为此,我们将利用在存储数据中的自然顺序,比如韶光戳或文档中存储的标识。
在这个例子中,我们将利用“_id”存储每个文档。“_id”是一个MongoDB 的ObjectID构造,即 12 字节构造包含了韶光戳、机器加工、进程标识符、计数器等。总体思路如下 :
检索当前页中的末了一个文档 _id不才一个页面检索文件大于此”_id”//Page 1db.users.find.limit(pageSize);//Find the id of the last document in this pagelast_id = ...//Page 2users = db.users.find({'_id'> last_id}). limit(10);//Update the last id with the id of the last document in this pagelast_id = ...
这种方法利用内在的规则存在_id字段。也由于“_id”字段是默认的查找操作,它是非常好的性能指标。如果你利用的字段没有被索引,那么你在操作中会受到困扰,以是确保字段被索引是非常主要的。
同样,如果你希望数据按照特定顺序进行排序分页的话,那么你还可以利用sort条款与上述技能。主要的是要确保排序过程是利用索引来得到最佳性能。您可以利用.explain后缀来查询。
users = db.users.find({'_id'> last_id}). sort(..).limit(10);//Update the last id with the id of the last document in this pagelast_id = ...