首页 > 解决方案 > 在mongodb中使用limit时如何获取匹配文档的真实数量?

问题描述

我在 mongodb 中有一个方面聚合。有用。现在,我需要限制结果才能无限滚动。如何获取整个集合中匹配文档的总数?

我可以获得集合中文档的总数,但这个数字不相关。我的目标是知道用户是否可以获取更多数据。如果他收到了 120 个文档,但有 150 个与他的过滤器匹配,则可以执行另一个查询。

这是我的查询:

db.collection.aggregate([
  {
    $facet: {
      data: [
        { $match: { score: {$gt: 80 } } },
        { $skip: 0},
        { $limit: 2},
        { $project: { score: 1 } }
      ],
    }
  },
])

您可以在此沙箱中使用假数据:https ://mongoplayground.net/p/EClbe0f_Fms

匹配文档的实际数量是 4。如果我在带有 $count 运算符的构面后添加一个“命中”,我会收到 7,即文档总数。如何有效地获取这些信息?

标签: mongodb

解决方案


最有效的方法是根本不使用 $count,而是检查收到的最后一页是否小于限制。IE:

const perPage = 10;
const results = await getPageOfResults();
const atEnd = results.length < perPage;

听起来您已经将 $count 添加到您的方面,但结果不正确。要获得匹配文档的“真实”数量,您需要将 $match 阶段添加到两个方面,例如https://mongoplayground.net/p/liQaiyZhYER

db.collection.aggregate([
  {
    $facet: {
      data: [
        { $match: { score: {$gt: 80 } } },
        { $skip: 0},
        { $limit: 2},
        { $project: { score: 1 } }
      ],
      count: [
        { $match: { score: {$gt: 80 } } },
        { $count: 'total' } 
      ]
    }
  },
  {$unwind: "$count"},
  {$addFields: {
     count: "$count.total"
  }}
])

推荐阅读