MongoDB聚合查询调整:按Category分组并分别统计归档与未归档记录数
调整MongoDB聚合查询实现按分类统计归档/未归档数量
嗨,我来帮你修改这个聚合查询,让它输出你想要的格式~
你的核心需求是按category分组,每个分类下同时展示归档和未归档的记录数,而当前的查询是把category和isArchived作为联合分组键,所以每个分类会拆成两条记录。我们只需要调整$group阶段的逻辑,用条件求和来分别统计两种状态的数量即可。
修改后的完整查询代码
getStats() { const stats = this.noteModel.aggregate([ { $group: { _id: '$category', // 仅按category字段分组 archived: { // 统计isArchived为true的记录数:满足条件加1,否则加0 $sum: { $cond: ['$isArchived', 1, 0] } }, unArchived: { // 统计isArchived为false的记录数,两种写法都可以 $sum: { $cond: [{ $eq: ['$isArchived', false] }, 1, 0] } // 或者用$not简化:$sum: { $cond: [{ $not: '$isArchived' }, 1, 0] } } } }, { $project: { _id: 0, // 移除默认生成的_id字段 category: '$_id', // 将分组键_id重命名为category archived: 1, // 保留archived字段 unArchived: 1 // 保留unArchived字段 } }, { $sort: { category: 1 } } // 按分类名称排序,和原逻辑一致 ]); return stats; }
关键调整说明
$group阶段优化:
- 把
_id改为仅使用$category,确保每个分类只生成一条记录 - 使用
$sum配合$cond条件表达式,分别统计两种isArchived状态的数量:$cond的格式是[条件表达式, 满足时的值, 不满足时的值],这里满足条件就加1,不满足加0,最终累加得到对应状态的总数
- 把
$project阶段调整:
- 移除默认的
_id字段,同时把分组用的_id重命名为category,让输出字段名完全匹配你的预期
- 移除默认的
用示例数据测试的输出结果
针对你提供的示例数据,修改后的查询会返回:
[ { "category": "IDEA", "archived": 1, "unArchived": 2 }, { "category": "TASK", "archived": 2, "unArchived": 1 } ]
完全符合你期望的格式。
内容的提问来源于stack exchange,提问作者Oleksandr Salivon
相关产品推荐
相关产品推荐

