翻阅数据是 MongoDB 最常见的操作之一. 一个典型的场景是需要在你的用户界面中显示你的结果. 如果你是批量处理的数据, 同样重要的是要让你的分页策略正确, 以便你的数据处理可以规模化.
接下来, 让我们通过一个例子来看在 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 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, 代码是这样的:
db.users.find().skip(pagesize*(n-1)).limit(pagesize) 然而, 随着数据的大小增加, 这种方法出现严重的性能问题. 其原因是在每次执行查询时, 建立了完整的结果集, 那么服务器必须从收集的开始走到指定的偏移量. 当偏移量增加时, 这一过程会变得越来越慢. 同时, 这个过程没有有效地使用索引. 所以, 当你有较小的数据集时, 典型的 "skip()" 和 "limit()" 的方法是有用的. 如果您正在使用大数据集, 您需要考虑其他方法.
方法二: Using find() 和 limit()
以前的方法不能很好扩展其原因是 skip() 命令. 因此, 本节的目标是实现分页不使用 skip() 命令. 为此, 我们将利用在存储数据中的自然顺序, 比如时间戳或文档中存储的标识.
在这个例子中, 我们将使用 "_id" 存储每个文档."_id" 是一个 MongoDB 的 ObjectID 结构, 即 12 字节结构包含了时间戳, 机械加工, 进程标识符, 计数器等. 总体思路如下 :
检索当前页中的最后一个文档 _id
在下一个页面检索文件大于此 "_id"
- //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() 后缀来查询.
- 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 = ...
来源: https://www.cnblogs.com/lykbk/p/sdgfdsdfdw454weer5erere.html