MongoDB基于_id指定字段合并多分组数组的聚合查询实现方案
实现方案
核心思路
$facet执行完成后会返回一条包含三个结果数组的单文档,你只需要在$facet阶段后追加几个聚合阶段,按al/st/lob三个维度分组合并不同数组的字段即可。
完整聚合追加代码
在你现有$facet阶段的后面,追加如下聚合阶段:
[ // 你原有的$facet阶段保留在这里 // { $facet: { AvgAggByGroup: [/*原有逻辑*/], FSByGroup: [/*原有逻辑*/], saByGroup: [/*原有逻辑*/] } }, // 合并三个结果数组 { $project: { allItems: { $concatArrays: ["$AvgAggByGroup", "$FSByGroup", "$saByGroup"] } } }, // 展开合并后的数组 { $unwind: "$allItems" }, // 按三个目标字段分组,合并对应字段 { $group: { _id: { al: "$allItems._id.al", st: "$allItems._id.st", lob: "$allItems._id.lob" }, // 按需替换下面的字段名,改成你三个数组里的实际输出字段 avgValue: { $max: "$allItems.avgValue" }, fsCount: { $max: "$allItems.fsCount" }, saTotal: { $max: "$allItems.saTotal" } } }, // 可选阶段:把三个维度字段提到根层级,和你期望的输出结构对齐 { $project: { _id: 0, al: "$_id.al", st: "$_id.st", lob: "$_id.lob", avgValue: 1, fsCount: 1, saTotal: 1 } } ]
场景适配说明
- 如果同一个分组下某个来源有多个结果,可以把
$max算子替换成你需要的聚合逻辑,比如数组拼接用$push、求和用$sum即可。 - 如果三个数组输出的字段很多,不想逐个枚举,可以在合并数组时给每个元素加来源标识,分组后用
$mergeObjects直接合并对象,减少代码量。
内容的提问来源于stack exchange,提问作者Vineet
相关产品推荐
相关产品推荐

