MongoDB中的分页技术:超越skip()的限制
人们普遍认为MongoDB依赖skip()方法随着数据的增长,分页可能会导致性能问题。为了应对这一挑战,另一种方法是利用 _id 字段的自然顺序进行分页。
最后一个文档的 ID
这种技术的关键在于从上一页确定最后一个文档的 ID,然后将其用作下一页的起点。然而,对于初学者来说,识别最后一个 ID 可能具有挑战性。
使用 _id 排序的仅向前分页
对于无法向后分页或跳到特定页面的场景必要时,可以采用称为“前向寻呼”的概念。此技术涉及迭代游标并存储最后看到的文档的 _id 以供后续查询。
使用 _id 排序的示例:
cursor = db.junk.find().limit(3); while (cursor.hasNext()) { doc = cursor.next(); if (!cursor.hasNext()) lastSeen = doc._id; }
复杂排序
当使用 _id 之外的不同排序字段时,会出现额外的复杂性。概念保持不变,但有必要使用 $nin 运算符排除以前见过的文档。
排名排序示例:
seenIds = []; cursor = db.junk.find({ "_id": { "$nin": seenIds }, "rank": "$lte": lastSeen } ).sort({ "rank": -1 }).limit(2); while (cursor.hasNext()) { doc = cursor.next(); seenIds.push(doc._id); if (!cursor.hasNext() || lastSeen == null) lastSeen = doc.rank; }
结论:
对于不需要向后分页的场景,前向分页是一个可行的选择。通过利用 $nin 运算符并管理可见的文档 ID,该技术提供了高效的分页,而没有与skip() 相关的内存消耗问题。
以上是带排序的仅前向分页能否消除 MongoDB 的分页限制?的详细内容。更多信息请关注PHP中文网其他相关文章!