gpt4 book ai didi

java - 使用 java 在 mongodb 上分页的最佳方法是什么

转载 作者:行者123 更新时间:2023-11-29 10:09:14 25 4
gpt4 key购买 nike

我正在尝试通过以下代码在 mongodb 中创建一个简单的分页。

collection.find().skip(n).limit(n);

但是如果我们看到在 Java 术语中首先 find 将返回所有记录,考虑到我有 200 万条记录,那么它看起来不会有性能问题,然后它将它传递给 skip 方法然后它将被传递限制方法。这意味着每次此查询将获取所有数据库记录或 mongodb 驱动程序以不同方式工作时,我错过了什么?

最佳答案

在谈到MongoDB中的分页时,很容易写出这样的代码:

collection.find().skip(pageSize*(pageNum-1)).limit(pageSize);

以上是MongoDB支持的原生解决方案,但如果集合中有大量文档,效率不高。假设你有 100M 个文档,你想从中间偏移量(50Mth)开始获取数据。 MongoDB 必须构建完整的数据集并从头开始走到指定的偏移量,这会降低性能。随着偏移量的增加,性能会不断下降。

根本原因是 skip() 命令效率不高,无法从索引中获得很大的好处。


下面是另一种提高大数据分页性能的解决方案:

分页的典型使用场景是有一个表格或者列表显示指定页的数据,还有一个'Previous Page' & 'Next Page'按钮加载上一页或下一页的数据。

如果你得到了当前页面最后一个文档的'_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() 时遍历大数据。

关于java - 使用 java 在 mongodb 上分页的最佳方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50260384/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com