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

MongoDB按ID合并对象数组:补全关联人员名称字段

解决方案

你可以在现有聚合管道的基础上,通过$map、$filter和$mergeObjects操作合并两个数组的内容,最终得到期望的结果:

db.people.aggregate([
  // 可选:添加$match过滤需要的文档
  // { $match: { /** ... */ }, },
  {
    $lookup: {
      from: "people",
      let: { relatedPeopleIds: "$relatedPeople.id" },
      pipeline: [
        { $match: { $expr: { $in: ["$id", "$$relatedPeopleIds"] } } },
        {
          $project: {
            id: 1,
            name: 1,
          },
        },
      ],
      as: "relatedPeople2",
    },
  },
  // 合并relatedPeople和relatedPeople2的内容
  {
    $addFields: {
      relatedPeople: {
        $map: {
          input: "$relatedPeople",
          as: "rp",
          in: {
            $mergeObjects: [
              "$$rp", // 保留原有的id和relation字段
              // 从relatedPeople2中匹配对应id的name字段
              { $first: { $filter: { input: "$relatedPeople2", cond: { $eq: ["$$this.id", "$$rp.id"] } } } }
            ]
          }
        }
      }
    }
  },
  // 只保留需要的字段,移除临时的relatedPeople2
  {
    $project: {
      _id: 1,
      id: 1,
      name: 1,
      relatedPeople: 1
    }
  }
]);

步骤说明

  1. $lookup阶段:从people集合中查询当前文档relatedPeople数组里所有id对应的人员,仅提取id和name字段,存入临时字段relatedPeople2。
  2. $addFields阶段:
    • 用$map遍历原relatedPeople数组的每个元素;
    • 对每个元素,通过$filter在relatedPeople2中找到id匹配的对象,$first确保只取匹配到的第一个结果(这里每个id唯一,所以只会有一个);
    • 用$mergeObjects将原元素的id、relation字段和匹配到的name字段合并,替换原来的relatedPeople字段。
  3. $project阶段:仅保留需要的_id、id、name和合并后的relatedPeople字段,移除临时的relatedPeople2。

这个方案会自动处理relatedPeople为空数组的情况,此时$map会返回空数组,符合你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 08:40:22