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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 10:13:11