MongoDB中实现查询结果分页
分页?
- 显著提高查询速度,每次只处理一小部分数据减少了数据库的负担。
- 简化数据展示,能让用户方便地浏览和查找所需信息。
用户界面展示
使用 HTTP GET 方法来获取分页的数据,其中page为数据页索引size为数据页大小:
/products?page={page}&size={size}
以表 products 为例
其中返回的数据的应该包含:全部商品数量,总页数,当前是第几页,当前页的全部产品数据。
服务端与数据库交互逻辑
代码片段以 express + MongoDB 为例:
- 服务端提取出 query 中的page和size
1 | const page = Number(req.query.page) || 1; |
进行数据库查询,提取 collection 中的当前页数据
根据 db.collection.find() 中的 limit 和 skip 选项来进行查询。
1
2
3
4
5
6
7const skip = (page - 1) *size;
// 当前页的产品数据
const products = await collection.find()
.skip(skip)
.limit(size)
.toArray();查询 collection 中的数据总条数
db.collection.estimatedDocumentCount() 不采用查询过滤,而是使用元数据返回集合的计数。
db.collection.countDocuments() 返回一个整数,代表与该集合或视图的查询匹配的文档数量。此方法可用于事务。
1
2const totalCount = await collection.estimatedDocumentCount();
//返回快 无法过滤1
2const totalCount = await collection.countDocuments({ deleted: { $ne: true } });
// 过滤掉所有 deleted: true 的 document根据总条数和每页大小计算总页数
1
const totalPages = Math.ceil(totalCount / size);
返回数据(以json为例):
1
2
3
4
5
6res.json({
totalCount,
totalPages,
currentPage: page,
products
});