You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 04:45:28