MongoDB如何合并统计ANumberAreaCode和BNumberAreaCode的区号出现总次数
MongoDB 区号总出现次数聚合查询方案
你可以通过单条聚合管道直接完成统计,不需要单独执行两次分组再合并,效率更高,完整查询如下:
db.collection.aggregate([ // 构造包含两个区号字段的数组 { $project: { areaCodes: ["$ANumberAreaCode", "$BNumberAreaCode"], _id: 0 } }, // 拆分数组为独立文档 { $unwind: "$areaCodes" }, // 按区号分组统计总次数 { $group: { _id: "$areaCodes", total: { $sum: 1 } } }, // 可选:调整输出格式为你需要的样式 { $project: { _id: 0, result: { $concat: ["$_id", " : ", { $toString: "$total" }] } } } ])
执行逻辑说明
- 首先通过
$project把每条记录的两个区号字段整合成一个名为areaCodes的数组,相当于把同一条记录里的两个区号放到同一个集合里 - 再用
$unwind把数组拆分成多条独立文档,每个文档只包含一个区号,相当于把所有出现的区号都拉平成了一维列表 - 最后按区号字段分组求和,就能直接得到每个区号在两个字段里的总出现次数
如果你坚持要基于你已经写好的两个分组结果合并,也可以用$facet一次性完成两次分组再合并统计,写法如下:
db.collection.aggregate([ { $facet: { aCount: [ { $group: { _id: "$ANumberAreaCode", count: { $sum: 1 } } } ], bCount: [ { $group: { _id: "$BNumberAreaCode", count: { $sum: 1 } } } ] } }, // 合并两个分组的结果数组 { $project: { allCounts: { $concatArrays: ["$aCount", "$bCount"] } } }, { $unwind: "$allCounts" }, // 二次分组求和得到总次数 { $group: { _id: "$allCounts._id", total: { $sum: "$allCounts.count" } } } ])
两种写法的最终统计结果完全一致,都会输出你需要的内容:
+98 : 3 +44 : 1 +1 :1 +96 :1
内容的提问来源于stack exchange,提问作者dez
相关产品推荐
相关产品推荐

