如何用MongoDB实现多字段分组并获取对应药物计数?
MongoDB聚合:按分类/子分类分组并计数
输入数据
[ { medicationDetails: { category: 'Asthma', subCategory: '' } }, { medicationDetails: { category: 'Diabetes', subCategory: 'Oral' } }, { medicationDetails: { category: 'Asthma', subCategory: '' } }, { medicationDetails: { category: 'Diabetes', subCategory: 'Insulin' } } ]
期望输出
{ medicationDetails: [ { name: 'Asthma', count: 2 }, { name: 'Oral', count: 1 }, { name: 'Insulin', count: 1 } ] }
解决方案聚合管道
db.collection.aggregate([ // 生成分组键:subCategory为空则用category,否则用subCategory { $addFields: { groupKey: { $cond: { if: { $eq: ["$medicationDetails.subCategory", ""] }, then: "$medicationDetails.category", else: "$medicationDetails.subCategory" } } } }, // 按分组键统计数量 { $group: { _id: "$groupKey", count: { $sum: 1 } } }, // 重命名字段,匹配输出格式 { $project: { _id: 0, name: "$_id", count: 1 } }, // 将所有统计结果收集到目标数组中 { $group: { _id: null, medicationDetails: { $push: "$$ROOT" } } }, // 移除多余的_id字段 { $project: { _id: 0 } } ])
步骤说明
- $addFields阶段:新增
groupKey字段,通过$cond条件判断,自动选择category或subCategory作为分组依据。 - 第一次$group阶段:按
groupKey分组,用$sum:1统计每组的文档数量。 - $project阶段:将分组后的
_id重命名为name,同时剔除默认的_id字段,对齐输出字段要求。 - 第二次$group阶段:将所有统计结果文档推入
medicationDetails数组,_id:null确保所有结果合并为一组。 - 最后$project阶段:移除最终结果中的
_id字段,完全匹配期望的输出格式。
内容的提问来源于stack exchange,提问作者Code The World
相关产品推荐
相关产品推荐

