如何对数组元素按值分组并统计其所在父数组项的数量
MongoDB统计每个Code出现的外层文档数量
要实现统计每个code值出现在多少个外层数组项(即顶层文档)中,核心是先对每个顶层文档里的code去重,再统计去重后的code对应的文档数,具体聚合管道如下:
db.collection.aggregate([ // 为每个顶层文档生成不重复的code数组 { $addFields: { uniqueCodes: { $setUnion: [ { $map: { input: "$providers", as: "provider", in: "$$provider.code" } } ] } } }, // 展开去重后的code数组 { $unwind: "$uniqueCodes" }, // 按code分组,统计出现的顶层文档数 { $group: { _id: "$uniqueCodes", total: { $sum: 1 } } }, // 调整输出格式,把_id改为code { $project: { _id: 0, code: "$_id", total: 1 } } ])
逻辑说明:
$map遍历每个顶层文档的providers数组,提取所有code值;$setUnion对提取出的code去重,确保每个顶层文档里同一个code只保留一个。- 对去重后的
uniqueCodes数组执行$unwind,此时每个条目对应一个"顶层文档+唯一code"的组合,不会重复统计同一文档里的相同code。 - 最后按
uniqueCodes分组并累加计数,得到的就是每个code出现在多少个顶层文档中的结果。
你之前直接unwind原始providers数组再求和,会把同一文档里的重复code都算进去,所以得到的是总出现次数而非文档数,这个方案解决了这个问题。
内容的提问来源于stack exchange,提问作者Nguyễn Đức Hiếu
相关产品推荐
相关产品推荐

