mongodb - 在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,即文档总数。如何有效地获取这些信息?
解决方案
最有效的方法是根本不使用 $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"
}}
])
推荐阅读
- java - 创建 ActiveMQ 代理在后续测试中失败,找不到服务:'META-INF/services/org/apache/activemq/wireformat/default'
- r - 如何在情节中在标题周围添加填充?
- sql - 如果不在排除表中,则插入 Sqlite
- angular - 更新不同的可观察值时如何更新可观察值?
- android - 集成系统语音操作,就像在 Twitter“查找 [xyz] [on] [app_name]”中一样。“在 [app_name] 上搜索 [xyz]”已经在工作
- angular - 在异步函数完成后调用一个函数
- powershell - 撤消 Conda Powershell 提示修改
- gulp - 使用 gulp 系列时从未定义的任务
- r - R - 用 dplyr 中的特定值替换变量
- c++ - 如何不使用命令行参数编译 CMakeLists.txt 的一部分?