java - 使用java在mongodb上分页的最佳方法是什么
问题描述
我正在尝试通过以下代码在 mongodb 中创建一个简单的分页。
collection.find().skip(n).limit(n);
但是如果我们看到在java术语中首先find会返回所有记录认为我有200万条记录,那么它看起来不会出现性能问题,然后它将它传递给skip方法,然后它将传递给limit方法. 这意味着每次此查询将获取所有数据库记录或 mongodb 驱动程序的工作方式不同,我错过了什么?
解决方案
当谈到 MongoDB 中的分页时,很容易编写以下代码:
collection.find().skip(pageSize*(pageNum-1)).limit(pageSize);
以上是 MongoDB 支持的原生解决方案,但是如果集合中有大量文档,则效率不高。假设您有 100M 个文档,并且您想从中间偏移量(50Mth)获取数据。MongoDB 必须建立完整的数据集并从头走到指定的偏移量,这将是低性能。随着偏移量的增加,性能会不断下降。
根本原因是skip()
命令效率不高,不能从索引中获得大的好处。
以下是提高大数据分页性能的另一种解决方案:
分页的典型使用场景是有一个表格或列表来显示指定页面的数据,还有一个“上一页”和“下一页”按钮来加载上一页或下一页的数据。
如果您获得了'_id'
当前页面中最后一个文档的 ,您可以使用find()
代替skip()
。使用_id > currentPage_LastDocument._id作为查找下一页数据的条件之一。这是伪代码:
//Page 1
collection.find().limit(pageSize);
//Get the _id of the last document in this page
last_id = ...
//Page 2
users = collection.find({'_id': {$gt: last_id}}).limit(pageSize);
//Update the last id with the _id of the last document in this page
last_id = ...
这将避免 MongoDB 在使用skip()
.
推荐阅读
- python - 通过刷新空页面Python3等待元素
- pandas - 生成带有条件的随机数列表 - numpy
- c# - 如何从 C# WPF 中的页面访问 MainWindow 变量?
- python - 在一个pdf文件中添加两个图形
- xcode - Xcode 中的 Git 提交模板
- vue.js - 是否有任何解决方案可以欺骗 vue 的生命周期钩子执行顺序?
- c# - 如何使外键自动填充连接到 ac# app 的关系数据
- amazon-web-services - EMR Hive ODBC 连接错误:HiveSQLException:预期状态:[已完成],但发现 RUNNING
- oracle - Popup LOV 或 Retutn P_Iten(如果 P_tem 在 Popup LOV 列表中)
- php - Nginx 全新的 codeigniter 安装在尝试访问控制器时显示 404 Not Found