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

