首页  >  文章  >  web前端  >  如何使用_id和前向分页在MongoDB中实现高效分页?

如何使用_id和前向分页在MongoDB中实现高效分页?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-10-24 06:55:02981浏览

How to Implement Efficient Pagination in MongoDB Using _id and Forward Paging?

如何在 MongoDB 中实现分页

虽然由于大规模内存消耗,通常不鼓励使用 Skip 进行分页,但另一种方法是利用 _id 字段进行自然排序。

获取最后一个文档的 _id

要获取给定页面上最后一个文档的 _id,您可以使用以下命令方法:

<code class="javascript">db.users.find().limit(pageSize);
//Find the id of the last document in this page
last_id = ...;</code>

前向分页

前向分页不是使用 .skip() 和 .limit(),而是迭代游标并存储最后看到的内容_ID。在后续迭代中,查询被修改为排除已经看到的文档,同时还将结果限制为 _id 小于或等于上次看到的值的结果。

对于按 _id 的自然顺序,代码如下所示this:

<code class="javascript">var lastSeen = null;
var cursor = db.junk.find().limit(3);

while (cursor.hasNext()) {
   var doc = cursor.next();
   if (!cursor.hasNext())
     lastSeen = doc._id;
}</code>

后续页面的修改查询

以下查询用于检索下一页:

<code class="javascript">var cursor = db.junk.find({ "_id": { "$gt": lastSeen } }).limit(3);</code>

复杂排序

要按 _id 以外的字段排序(例如排名),您需要跟踪以前看过的文档并使用 $nin 运算符将其排除。

这里是按排名排序的前向分页示例代码片段:

<code class="javascript">var lastSeen = null;
var seenIds = [];
var cursor = db.junk.find().sort({ "rank": -1 }).limit(2);

while (cursor.hasNext()) {
   var doc = cursor.next();
   if ( lastSeen != null &amp;&amp; doc.rank != lastSeen )
       seenIds = [];
   seenIds.push(doc._id);
   if (!cursor.hasNext() || lastSeen == null)
     lastSeen = doc.rank;
}</code>

下一页的后续查询将是:

<code class="javascript">var cursor = db.junk.find(
    { "_id": { "$nin": seenIds }, "rank": "$lte": lastSeen }
).sort({ "rank": -1 }).limit(2);</code>

以上是如何使用_id和前向分页在MongoDB中实现高效分页?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn