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

如何在MongoDB中按两个关联字段正确分组并合并数据

解决方案

你可以通过MongoDB聚合管道实现需求,核心逻辑是统一分组键:将存在associatedField的文档的分组键设为associatedField的值,无该字段的文档分组键设为自身field的值,保证有关联的文档进入同一分组。

完整聚合语句

db.collection.aggregate([
  // 1. 构造统一分组键
  {
    $addFields: {
      groupKey: {
        $cond: {
          if: { $ne: ["$associatedField", undefined] },
          then: "$associatedField",
          else: "$field"
        }
      }
    }
  },
  // 2. 按groupKey分组,合并数据
  {
    $group: {
      _id: "$groupKey",
      fields: { $push: "$field" },
      data: { $push: "$data" }
    }
  },
  // 3. 扁平化data数组,处理字段格式
  {
    $project: {
      _id: 0,
      field: "$_id",
      associatedField: {
        $first: {
          $filter: {
            input: "$fields",
            cond: { $ne: ["$$this", "$_id"] }
          }
        }
      },
      data: {
        $reduce: {
          input: "$data",
          initialValue: [],
          in: { $concatArrays: ["$$value", "$$this"] }
        }
      }
    }
  },
  // 4. 移除无关联文档的空associatedField字段
  {
    $replaceRoot: {
      newRoot: {
        $cond: {
          if: { $eq: ["$associatedField", null] },
          then: { field: "$field", data: "$data" },
          else: "$$ROOT"
        }
      }
    }
  }
])

逻辑说明

  • $addFields阶段生成统一分组键,确保有关联的文档被分到同一个组
  • $group阶段收集组内所有field值和data数组内容
  • $project阶段将嵌套的数组合并为一维数组,同时提取关联的associatedField值
  • 最后一个阶段可选,用于适配无关联文档的输出格式,自动移除值为null的associatedField字段

内容的提问来源于stack exchange,提问作者Teo Tns

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 09:54:03