MongoDB - 限制记录数
MongoDB - 限制和分页记录
Section titled “MongoDB - 限制和分页记录”当查询大型数据集时,您很少会希望一次性检索所有文档。MongoDB 提供了游标方法来限制结果数量、跳过文档以及对它们进行排序,这些都是分页等功能的基础。
limit() 方法
Section titled “limit() 方法”limit() 方法指定游标将返回的最大文档数量。它接受一个数字参数。
db.COLLECTION_NAME.find(<query>).limit(<number>)假设有一个 posts 集合。要获取最近的 5 篇文章,您应该结合使用 sort() 和 limit()。
// 假设 'posts' 集合包含 'title' 和 'publishDate' 字段。
// 查找最近发布的 5 篇文章db.posts.find() .sort({ publishDate: -1 }) // -1 表示降序(最新在前) .limit(5);专家提示:始终将 sort() 与 limit() 结合使用
Section titled “专家提示:始终将 sort() 与 limit() 结合使用”如果没有 sort(),find() 查询返回的文档顺序是不确定的。如果您在没有 sort() 的情况下使用 limit(),每次运行查询时,您可能会得到一组不同的 5 个文档。始终提供明确的排序顺序以确保结果的一致性。
skip() 方法
Section titled “skip() 方法”skip() 方法控制结果集的起始点,它告诉游标从开头丢弃指定数量的文档。
db.COLLECTION_NAME.find(<query>).skip(<number>)示例:实现分页
Section titled “示例:实现分页”您可以结合使用 sort()、skip() 和 limit() 来构建经典的分页系统。例如,要显示我们博客的第 3 页,每页显示 10 篇文章:
const page = 3;const postsPerPage = 10;const postsToSkip = (page - 1) * postsPerPage; // (3 - 1) * 10 = 20
db.posts.find() .sort({ publishDate: -1 }) .skip(postsToSkip) .limit(postsPerPage);此查询按日期排序所有文章,跳过前 20 篇,然后返回接下来的 10 篇。
常见陷阱:skip() 性能
Section titled “常见陷阱:skip() 性能”虽然 skip() 易于使用,但在非常大的集合上可能会变慢。要跳过 N 个文档,服务器仍然必须在返回结果之前获取并遍历所有 N 个文档。这被称为“偏移问题”。
对于高性能的“无限滚动”式分页,更好的方法是键集分页(或基于游标的分页)。这涉及使用索引字段(如 _id 或时间戳)上的过滤器,从上一页的最后一个项目开始获取下一组结果,这效率更高。