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