MongoDB中实现查询结果分页

分页?

  • 显著提高查询速度,每次只处理一小部分数据减少了数据库的负担。
  • 简化数据展示,能让用户方便地浏览和查找所需信息。

用户界面展示

使用 HTTP GET 方法来获取分页的数据,其中page为数据页索引size为数据页大小:

/products?page={page}&size={size}

以表 products 为例

其中返回的数据的应该包含:全部商品数量,总页数,当前是第几页,当前页的全部产品数据。

服务端与数据库交互逻辑

代码片段以 express + MongoDB 为例:

  • 服务端提取出 query 中的page和size
1
2
const page = Number(req.query.page) || 1;
const size = Number(req.query.size) || 10;
  • 进行数据库查询,提取 collection 中的当前页数据

    根据 db.collection.find() 中的 limit 和 skip 选项来进行查询。

    1
    2
    3
    4
    5
    6
    7
    const skip = (page - 1) *size;

    // 当前页的产品数据
    const products = await collection.find()
    .skip(skip)
    .limit(size)
    .toArray();
  • 查询 collection 中的数据总条数

    db.collection.estimatedDocumentCount() 不采用查询过滤,而是使用元数据返回集合的计数。

    db.collection.countDocuments() 返回一个整数,代表与该集合或视图的查询匹配的文档数量。此方法可用于事务

    1
    2
    const totalCount = await collection.estimatedDocumentCount(); 
    //返回快 无法过滤
    1
    2
    const totalCount = await collection.countDocuments({ deleted: { $ne: true } });
    // 过滤掉所有 deleted: true 的 document
  • 根据总条数和每页大小计算总页数

    1
    const totalPages = Math.ceil(totalCount / size);
  • 返回数据(以json为例):

    1
    2
    3
    4
    5
    6
    res.json({
    totalCount,
    totalPages,
    currentPage: page,
    products
    });