在项目中,通常会有分页的需求,分页有两种实现方式:真分页和假分页。假设每页要显示10条数据,真分页只查询10条数据,当进行换页的时候,只是查询到对应页数应该显示10条数据;假分页会一次性把所有数据查询出来,然后进行计算本页应该显示的10条数据。
方式一
所需内容:当前要查询的页数(page
)、每一页显示的条数(pagesize
)、数据的总数(count
)、总页数(total
)、开始查询的位置(start
)
作为服务器端,page
是由客户端传递过来的参数,在服务器端接收即可,如果没有传递参数的话,默认是1,查询第一页的数据。
let page = req.query.page || 1;
pagesize
可以由客户端传递过来,也可以在服务器端指定,这个需要看项目的需求了,如果需求中可以由用户选择每页显示的条数,那可以由客户端传递参数的方式实现,否则,可以在服务器端指定。本文采取第二种方式:
let pagesize = 10;
count
数据的总数可以由服务器端查询获得。
total
总页数可以通过计算获得:Math.ceil()
是将数据向上取整。
let total = Math.ceil(count / pagesize)
start
表示从第几条数据开始查询。
let start = (page - 1) * pagesize
从数据中查询的SQL语句:
let users = User.find({}).limit(pagesize).skip(start)
方式二
分页功能的实现依赖第三方模块mongoose-sex-page
。
1.安装模块mongoose-sex-page
npm install mongoose-sex-page
2.引入模块mongoose-sex-page
const pagination = require('mongoose-sex-page')
3.从数据中查询
// page 指定当前页 对于方式一的page
// size 指定每页显示的数据条数 对于方式一的pagesize
// display 指定客户端要显示的页码数量
// exec 向数据库中发送查询请求
let articles = pagination(Article).find().page(page).size(2).display(3).populate('author').exec()
至此,两种分页实现方式就结束了,有点类似与面向过程与面向对象,方式一事事亲为,每一个变量自己去计算出来,方式二直接使用第三方模块传递参数即可。