MongoDB查询中对数组元素执行Groupby,统计不同元素的重复次数
MongoDB统计数组字段内元素出现次数的实现方法
你可以通过MongoDB的聚合(Aggregation)管道实现该需求,核心用到$unwind和$group两个操作符,以下是具体实现代码:
// 请将下方的collectionName替换为你实际的集合名称 db.collectionName.aggregate([ // 第一步:拆分tags数组,将每个数组元素转为独立的文档 { $unwind: "$tags" }, // 第二步:按标签值分组,统计每个标签的出现次数 { $group: { _id: "$tags", count: { $sum: 1 } } }, // 可选:按出现次数倒序排序,方便查看高频标签 { $sort: { count: -1 } } ])
执行逻辑说明
$unwind: "$tags":会把每一条原文档中的tags数组拆分为N条文档(N为数组长度),每条文档仅保留tags数组中的一个元素。针对你给出的示例数据,该阶段执行后会生成6条文档。$group阶段:以tags字段的具体值作为分组依据,$sum: 1表示每匹配到一个同组的文档就计数加1,最终得到每个标签的总出现次数。
示例数据返回结果
针对你给出的两条示例数据,执行上述聚合语句后返回结果如下:
{ "_id" : "database", "count" : 2 } { "_id" : "SQL", "count" : 1 } { "_id" : "NoSQL", "count" : 1 } { "_id" : "mongodb", "count" : 1 } { "_id" : "PHP", "count" : 1 }
拓展场景
如果需要过滤出现次数大于N的标签,可以在聚合管道最后追加$match阶段,比如过滤出现次数≥2的标签:
db.collectionName.aggregate([ { $unwind: "$tags" }, { $group: { _id: "$tags", count: { $sum: 1 } } }, { $match: { count: { $gte: 2 } } } ])
内容的提问来源于stack exchange,提问作者Ali
相关产品推荐
相关产品推荐

