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

如何在MongoDB中对数组元素分组并统计数量?

统计MongoDB文档数组内元素的出现次数

针对你提供的集合结构,要统计每个文档中fruits数组内各元素的出现次数,可以通过MongoDB的聚合管道实现,具体方案如下:

聚合查询代码

db.collection.aggregate([
  // 拆分数组,将每个水果元素转为单独文档
  { $unwind: "$fruits" },
  // 按文档_id和水果名称分组,统计单个水果的出现次数
  {
    $group: {
      _id: {
        docId: "$_id",
        fruit: "$fruits"
      },
      count: { $sum: 1 }
    }
  },
  // 按文档_id重新聚合,将统计结果整理为键值对格式
  {
    $group: {
      _id: "$_id.docId",
      fruitCounts: {
        $push: {
          k: "$_id.fruit",
          v: "$count"
        }
      }
    }
  },
  // 将键值对数组转为对象格式(可选,让结果更直观)
  {
    $project: {
      _id: 1,
      fruitCounts: { $arrayToObject: "$fruitCounts" }
    }
  }
])

执行结果示例

运行后会得到符合需求的结构化结果:

[
  { "_id": ObjectId(1), "fruitCounts": { "Banana": 2, "Apple": 1 } },
  { "_id": ObjectId(2), "fruitCounts": { "Apple": 1 } }
]

各阶段作用说明

  • $unwind: 把每个文档的fruits数组拆分成多条子文档,每条子文档仅包含一个水果元素,为后续统计做准备。
  • 第一个$group: 同时按原始文档的_id和水果名称分组,计算每个水果在对应文档内的出现次数。
  • 第二个$group: 按原始文档_id重新合并数据,将每个水果的统计结果收集为键值对数组。
  • $project: 通过$arrayToObject将数组转为对象格式,让统计结果更易读(不需要此格式可省略该阶段)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 07:54:22