MongoDB如何按code和name分组统计A/B/C三类数量并输出单行结果
实现方案
你可以直接使用MongoDB的聚合(Aggregation)管道实现需求,核心是分组时用条件累加不同type的计数,完整语句如下:
db.collection.aggregate([ // 第一阶段:按code+name分组,统计各type的数量 { $group: { _id: { code: "$code", name: "$name" }, // 统计type=A的数量,符合条件加1,否则加0 totalA: { $sum: { $cond: [{ $eq: ["$type", "A"] }, 1, 0] } }, // 统计type=B的数量 totalB: { $sum: { $cond: [{ $eq: ["$type", "B"] }, 1, 0] } }, // 统计type=C的数量 totalC: { $sum: { $cond: [{ $eq: ["$type", "C"] }, 1, 0] } } } }, // 第二阶段:格式化输出字段,按需拼接字符串 { $project: { _id: 0, // 你需要的连字符拼接格式行 line: { $concat: [ "$_id.name", "-", "$_id.code", "-", { $toString: "$totalA" }, "-", { $toString: "$totalB" }, "-", { $toString: "$totalC" } ] }, // 可保留单独字段方便后续处理,不需要可以删除 name: "$_id.name", code: "$_id.code", totalA: 1, totalB: 1, totalC: 1 } } ])
逻辑说明
- $group阶段的分组键用
code+name,因为你提到两个字段一一对应,不会出现同code不同name的情况,分组逻辑不会产生冗余 - $cond是条件表达式,匹配对应type就返回1给$sum累加,否则返回0,就能分别统计三类的计数
- 如果不需要单独的计数字段,只想要拼接好的行,可以把$project里的name、code、totalA等字段直接删掉
内容的提问来源于stack exchange,提问作者count_campeador
相关产品推荐
相关产品推荐

