如何在 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 && 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中文网其他相关文章!