MongoDB查询:统计同data_id下data_list元素出现次数
统计MongoDB同一data_id下数组元素的出现次数
原始集合数据
[ /* 1 */ { "_id" : 1, "data_id" : 1, "data_test" : "sample1", "data_list" : [ "sun" ] }, /* 2 */ { "_id" : 2, "data_id" : 1, "data_test" : "sample2", "data_list" : [ "sun", "mon" ] }, /* 3 */ { "_id" : 3, "data_id" : 2, "data_test" : "sample3", "data_list" : [ "tue" ] }, /* 4 */ { "_id" : 4, "data_id" : 2, "data_test" : "sample4", "data_list" : [ "tue", "wed" ] } ]
需求说明
需要统计指定data_id下,data_list数组中每个元素的出现次数,输出键值对格式的结果:
- 查询
data_id=1时,期望输出:
{ "sun": 2, "mon": 1 }
- 查询
data_id=2时,期望输出:
{ "tue": 2, "wed": 1 }
解决方案:MongoDB聚合查询
使用聚合管道实现需求,以下是针对data_id=1的完整查询语句:
db.collection.aggregate([ // 筛选目标data_id的文档 { $match: { data_id: 1 } }, // 拆分数组,每个元素单独成为一条记录 { $unwind: "$data_list" }, // 按数组元素分组,统计出现次数 { $group: { _id: "$data_list", count: { $sum: 1 } } }, // 将统计结果转换为键值对对象 { $group: { _id: null, result: { $arrayToObject: [{ $push: { k: "$_id", v: "$count" } }] } } }, // 将结果对象作为根文档返回 { $replaceRoot: { newRoot: "$result" } } ])
说明:
- 修改
$match阶段的data_id值,即可查询其他分组的统计结果(比如改为data_id:2)。 $unwind用于将数组拆分为单个元素,是统计数组元素的关键步骤。$arrayToObject将分组后的数组转换为键值对格式,最终通过$replaceRoot输出期望的结构。
查询结果示例
执行上述查询data_id=1后,输出结果与期望一致:
{ "sun" : 2, "mon" : 1 }
查询data_id=2时,输出:
{ "tue" : 2, "wed" : 1 }
内容的提问来源于stack exchange,提问作者br0ek
相关产品推荐
相关产品推荐

