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

MongoDB聚合阶段中如何统计数组内的去重值及出现次数

MongoDB聚合统计数组属性唯一值及出现次数

最直接高效的方案是利用MongoDB的$unwind拆分数组元素,再通过$group统计每个值的出现次数——这比用$reduce等内存数组操作更简洁,性能也更优,适合大规模数据处理。

结果格式:数组对象(结构清晰,推荐)

执行以下聚合管道可得到你想要的第二种结果格式:

db.collection.aggregate([
  // 将数组拆分为单个元素文档
  { $unwind: "$values" },
  // 按数组元素分组,统计出现次数
  {
    $group: {
      _id: "$values",
      count: { $sum: 1 }
    }
  },
  // 重命名字段为需求格式
  {
    $project: {
      _id: 0,
      id: "$_id",
      count: 1
    }
  },
  // 将所有统计结果合并到一个数组中
  {
    $group: {
      _id: null,
      values: { $push: "$$ROOT" }
    }
  },
  // 移除多余的_id字段
  {
    $project: {
      _id: 0
    }
  }
])

结果格式:键值对对象

如果需要第一种键值对格式,可调整管道最后阶段,用$arrayToObject转换结果:

db.collection.aggregate([
  { $unwind: "$values" },
  {
    $group: {
      _id: "$values",
      count: { $sum: 1 }
    }
  },
  // 转换为{k: v}结构的临时对象
  {
    $project: {
      _id: 0,
      key: "$_id",
      value: "$count"
    }
  },
  // 合并并转换为键值对对象
  {
    $group: {
      _id: null,
      values: { $push: { k: "$key", v: "$value" } }
    }
  },
  {
    $replaceRoot: {
      newRoot: {
        values: { $arrayToObject: "$values" }
      }
    }
  }
])

注意

对于大数据集,$unwind是MongoDB优化过的操作,若数组字段有索引还能进一步提升性能,比在内存中用数组操作符处理更可控。

内容的提问来源于stack exchange,提问作者Craig

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 10:50:30