Mongoose Paginate 用于 JavaScript (Node.js):完整指南及示例
\n\n欢迎来到 PythonLib!今天我们将解析 Mongoose Paginate——这是在使用 Mongoose ODM(对象数据建模)连接 MongoDB 的 Node.js 应用中,实现分页功能最流行的库之一。
\n\n1. 这是什么以及为什么需要它
\n\nMongoose Paginate 是一个轻量级的 Mongoose 插件,它为您的模式添加了 paginate() 方法。它允许您轻松地将大型数据集分页,避免一次性加载所有文档。
为什么需要它?在实际应用(博客、电商网站、API)中,数据库包含数千甚至数百万条记录。一次性全部加载会导致:
\n- \n
- 服务器负载巨大(内存、CPU)。 \n
- API 响应缓慢(用户等待响应数分钟)。 \n
- 用户体验差(无分页或“下一页”按钮的无尽滚动)。 \n
Mongoose Paginate 通过提供一个现成的、经过测试且灵活的分页实现来解决这些问题。它会自动计算文档总数,返回所需的页面,并提供元信息(当前页、总页数、是否有下一页/上一页)。
\n\n2. 安装
\n\n通过 npm(Node 包管理器)进行安装。请确保您已安装 Node.js 和 npm。
\n\nnpm install mongoose-paginate-v2\n\n重要提示: 该库有两个版本:
\n- \n
mongoose-paginate— 旧版,维护较少。 \n mongoose-paginate-v2— 当前推荐版本,功能更多,修复更全。 \n
在本文中,我们将使用 mongoose-paginate-v2。
\n\n3. 快速入门 — 最小工作示例
\n\n让我们创建一个简单的“用户”模型,并对其应用分页。
\n\n// 1. 引入依赖\nconst mongoose = require('mongoose');\nconst mongoosePaginate = require('mongoose-paginate-v2');\n\n// 2. 定义模式\nconst userSchema = new mongoose.Schema({\n name: String,\n email: String,\n age: Number,\n createdAt: { type: Date, default: Date.now }\n});\n\n// 3. 向模式添加分页插件\nuserSchema.plugin(mongoosePaginate);\n\n// 4. 创建模型\nconst User = mongoose.model('User', userSchema);\n\n// 5. 连接到 MongoDB(以本地数据库为例)\nasync function main() {\n await mongoose.connect('mongodb://localhost:27017/testdb');\n\n // 6. 插入测试数据(如果不存在)\n const count = await User.countDocuments();\n if (count === 0) {\n const users = [];\n for (let i = 1; i <= 50; i++) {\n users.push({ name: `User ${i}`, email: `user${i}@example.com`, age: 20 + (i % 30) });\n }\n await User.insertMany(users);\n console.log('已插入 50 个用户');\n }\n\n // 7. 使用分页\n const options = {\n page: 1, // 页码(默认为 1)\n limit: 10, // 每页元素数量(默认为 10)\n };\n\n const result = await User.paginate({}, options);\n\n console.log('分页结果:');\n console.log('文档:', result.docs);\n console.log('文档总数:', result.totalDocs);\n console.log('总页数:', result.totalPages);\n console.log('当前页:', result.page);\n console.log('是否有下一页:', result.hasNextPage);\n console.log('是否有上一页:', result.hasPrevPage);\n\n await mongoose.disconnect();\n}\n\nmain().catch(console.error);\n\n\n这段代码将创建 50 个用户,然后请求包含 10 个用户的第一页。