如何在MongoDB中按设备类型统计各设备状态的数量?
MongoDB按设备类型分组统计各状态数量
你可以通过MongoDB聚合框架的$group阶段结合$cond条件表达式,分别统计每种设备类型下各状态的数量,再通过$project阶段调整输出字段格式,匹配你需要的报表结构。
完整查询语句
db.Collection_Name.aggregate([ // 可选:如果数据中存在"Device Type"(带空格)这类不一致字段,先统一字段名 { $addFields: { DeviceType: { $ifNull: ["$DeviceType", "$Device Type"] }, DeviceStatus: { $ifNull: ["$DeviceStatus", "$Device Status"] } } }, // 按DeviceType分组,统计各状态数量 { $group: { _id: "$DeviceType", DeviceStatusOnCount: { $sum: { $cond: [{ $eq: ["$DeviceStatus", "On"] }, 1, 0] } }, DeviceStatusOffCount: { $sum: { $cond: [{ $eq: ["$DeviceStatus", "Off"] }, 1, 0] } }, DeviceStatusInRepairCount: { $sum: { $cond: [{ $eq: ["$DeviceStatus", "InRepair"] }, 1, 0] } } } }, // 将_id重命名为DeviceType,并可选将数字转为字符串(匹配示例格式) { $project: { _id: 0, DeviceType: "$_id", DeviceStatusOnCount: { $toString: "$DeviceStatusOnCount" }, DeviceStatusOffCount: { $toString: "$DeviceStatusOffCount" }, DeviceStatusInRepairCount: { $toString: "$DeviceStatusInRepairCount" } } } ])
关键阶段说明
$addFields阶段:如果数据中存在字段名不一致(比如示例里的Device Type和DeviceType),此阶段可统一字段名,避免分组遗漏数据。若数据字段名完全一致,可省略此阶段。$group阶段:_id: "$DeviceType"指定按设备类型分组- 每个状态统计字段通过
$sum+$cond实现条件计数:当DeviceStatus匹配目标状态时加1,否则加0,最终得到对应状态的设备数量
$project阶段:- 隐藏默认的
_id字段,将分组标识_id重命名为DeviceType - 使用
$toString将统计数字转为字符串类型,匹配你示例中的输出格式;若不需要字符串类型,可直接移除$toString,保留数字输出
- 隐藏默认的
示例数据执行结果
用你提供的测试数据执行上述查询,会得到如下结果:
[ { "DeviceType": "A", "DeviceStatusOnCount": "2", "DeviceStatusOffCount": "1", "DeviceStatusInRepairCount": "0" }, { "DeviceType": "B", "DeviceStatusOnCount": "1", "DeviceStatusOffCount": "0", "DeviceStatusInRepairCount": "0" } ]
内容的提问来源于stack exchange,提问作者Kaushik Mahadevan
相关产品推荐
相关产品推荐

