如何用MongoDB聚合框架统计指定id的不同cate_id数量
使用MongoDB聚合框架实现按ID分组统计分类次数
嘿,这需求完全可以通过MongoDB的聚合管道一步步实现,我给你拆解一下具体怎么做:
首先,我们需要先按id和cate_id的组合分组统计次数,再把同一id下的分类统计结果整理成数组,最后调整输出格式。直接上完整的聚合命令:
db.collection.aggregate([ // 第一步:统计每个id下每个cate_id的出现次数 { $group: { _id: { id: "$id", cate_id: "$cate_id" }, count: { $sum: 1 } } }, // 第二步:按id聚合,把分类统计结果整理成数组 { $group: { _id: "$_id.id", categories: { $push: { cate_id: "$_id.cate_id", count: "$count" } } } }, // 第三步:调整输出字段,让格式完全匹配你的期望 { $project: { _id: 0, id: "$_id", categories: 1 } } ])
我给你解释下每个阶段的作用:
- 第一个
$group:把相同id+相同cate_id的文档归为一组,用$sum:1统计每组的文档数量,这样就能得到每个id下每个分类的出现次数。 - 第二个
$group:这次只按id分组,用$push操作把上一步得到的cate_id和count打包成对象,逐个添加到categories数组里。 - 第三个
$project:用来调整输出格式——把聚合生成的_id(也就是我们要的业务id)重命名为id,同时去掉默认的_id字段,最终输出就和你想要的一模一样了。
用你提供的样本数据运行这个命令,就能得到:
{ "id": 49893861, "categories": [ { "cate_id": "1102", "count": 2 }, { "cate_id": "81614", "count": 1 } ] }
内容的提问来源于stack exchange,提问作者Andy Ho




