Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用java在mongodb上分页的最佳方式是什么_Java_Mongodb - Fatal编程技术网

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

使用java在mongodb上分页的最佳方式是什么,java,mongodb,Java,Mongodb,我试图通过下面的代码在mongodb中创建一个简单的分页 collection.find().skip(n).limit(n); 但是,如果我们发现在java术语中,首先查找将返回所有记录,考虑到我有200万条记录,那么它将通过它跳过SKIP方法,然后它将被传递给限制方法,那么它看起来是否会出现性能问题。这意味着每次此查询将获取所有db记录或mongodb驱动程序的工作方式不同,我错过了什么?在mongodb中讨论分页时,很容易编写以下代码: collection.find().skip(pa

我试图通过下面的代码在mongodb中创建一个简单的分页

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

但是,如果我们发现在java术语中,首先查找将返回所有记录,考虑到我有200万条记录,那么它将通过它跳过SKIP方法,然后它将被传递给限制方法,那么它看起来是否会出现性能问题。这意味着每次此查询将获取所有db记录或mongodb驱动程序的工作方式不同,我错过了什么?

在mongodb中讨论分页时,很容易编写以下代码:

collection.find().skip(pageSize*(pageNum-1)).limit(pageSize);
以上是MongoDB支持的本机解决方案,但如果集合中有大量文档,则效率低下。假设您有100万个文档,并且希望从中间偏移量(50次)获取数据MongoDB必须建立完整的数据集,并从开始走到指定的偏移量,这将是低性能的。随着偏移量的增加,性能会不断降低

根本原因是
skip()
命令效率低下,无法从索引中获得巨大好处。


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

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

如果您获得了当前页面中最后一个文档的
“id”
,则可以使用
find()
而不是
skip()
。使用\u id>currentPage\u LastDocument.\u 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()

时遍历大数据。您查看过文档了吗?是的,它没有告诉您类似的内容。第二种方法怎么可能显示像1、2、3、4、5这样的页码,用户可以轻松地在它们之间移动。@johncena,系统设计取决于您的系统的使用情况和场景,但您不会谈论任何关于它的内容。如果您想显示页码供用户单击,我认为您只能显示(当前-2,当前-1,当前,当前+1,当前+2)而不是所有页码,那么您可以从方法-2中获益。事实上,我猜用户不希望看到1~9999之间的页码,所有这些都在页面中:)如果我想按“双三角形按钮”获得10多个页面(这是一个常见的UI请求),该怎么办?直接到最后一页?在这种情况下,我认为没有比跳过/限制更好的方法了。事实上,有1M条记录,我看到一条
find(Criteria).跳过().limit().sort()
和一条
find(Criteria).count()
将在5秒(第一次查询)/3秒(第二次查询)内以任意页码返回正确的总数和页码。不是很好,但没有其他选择。