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

MongoDB中如何为嵌套数组关联添加对应文档字段?

MongoDB嵌套数组关联用户并添加字段的解决方案

需求场景

现有两个集合:

  • Routes:文档包含嵌套的routes数组,部分数组元素带有driver_id字段
  • Users:文档以_id(ObjectId类型)为主键,包含name字段

需要将Routes中routes数组元素的driver_id与Users的_id匹配,为对应元素添加driver_name字段(值为对应用户的name)。

正确聚合查询实现

db.Routes.aggregate([
  // 关联Users集合,获取所有相关司机信息
  {
    $lookup: {
      from: "Users",
      localField: "routes.driver_id",
      foreignField: "_id",
      as: "drivers"
    }
  },
  // 遍历routes数组,匹配并添加driver_name字段
  {
    $addFields: {
      routes: {
        $map: {
          input: "$routes",
          as: "route",
          in: {
            $mergeObjects: [
              "$$route",
              {
                $cond: {
                  if: "$$route.driver_id",
                  then: {
                    driver_name: {
                      $getField: {
                        field: "name",
                        input: {
                          $arrayElemAt: [
                            {
                              $filter: {
                                input: "$drivers",
                                cond: { $eq: ["$$this._id", { $toObjectId: "$$route.driver_id" }] }
                              }
                            },
                            0
                          ]
                        }
                      }
                    }
                  },
                  else: {}
                }
              }
            ]
          }
        }
      }
    }
  },
  // 移除临时的drivers字段
  {
    $project: {
      drivers: 0
    }
  }
])

关键步骤说明

  1. $lookup:批量关联所有相关的用户数据,将匹配的用户文档存入临时字段drivers,避免多次查询。
  2. $map + $mergeObjects:遍历原routes数组,将每个元素与新增的driver_name字段合并(如果存在driver_id)。
  3. 类型转换匹配:由于driver_id是字符串类型,而Users._id是ObjectId,使用$toObjectId转换后再通过$filter匹配对应的用户,确保类型一致。
  4. $project:清理临时字段,返回干净的结果结构。

执行结果

执行上述聚合后,将得到符合预期的结果:

[{
  "routes": [{
    "driver_id": "61e9536f142f337c96883c52",
    "driver_name": "John",
    "route_id": "SRT006",
    "payment": 13.2
  }, {
    "driver_id": "61e9536f142f337c96800a56",
    "driver_name": "Bob",
    "route_id": "SRT005",
    "payment": 15
  }, {
    "route_id": "SRT004",
    "payment": 20
  }],
  "apartment": "abc apartment",
  "deliverydate": "06/03/2022"
}]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 08:06:52