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 } } ])
关键步骤说明
- $lookup:批量关联所有相关的用户数据,将匹配的用户文档存入临时字段
drivers,避免多次查询。 - $map + $mergeObjects:遍历原
routes数组,将每个元素与新增的driver_name字段合并(如果存在driver_id)。 - 类型转换匹配:由于
driver_id是字符串类型,而Users._id是ObjectId,使用$toObjectId转换后再通过$filter匹配对应的用户,确保类型一致。 - $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
相关产品推荐
相关产品推荐

