You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 05:27:02