如何在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
相关产品推荐
相关产品推荐

