如何在MongoDB中合并关联文档去重并保留when字段数据
问题原因
你出现多余关联数据的核心原因是拆分U_W数组后做关联查询时,没有绑定同一条U_W记录内的workId和userId对应关系,导致产生笛卡尔积(2个用户*2个工作生成4条交叉匹配结果),同时在数组展开阶段没有保留when字段和对应U_W数组的绑定关系。
解决方法
使用如下聚合查询即可得到你期望的结构:
db.schedule.aggregate([ // 展开schedule下的daily数组,保留when字段 { $unwind: "$schedule.daily" }, // 展开daily下的U_W数组,每条记录对应一组绑定的workId+userId { $unwind: "$schedule.daily.U_W" }, // 关联用户表,匹配当前U_W记录的userId { $lookup: { from: "userSchema", localField: "schedule.daily.U_W.userId", foreignField: "_id", as: "user_info" } }, { $unwind: "$user_info" }, // 关联工作表,匹配当前U_W记录的workId { $lookup: { from: "workSchema", localField: "schedule.daily.U_W.workId", foreignField: "_id", as: "work_info" } }, { $unwind: "$work_info" }, // 按文档主键、when字段、根WorkId分组,重构U_W数组 { $group: { _id: { root_id: "$_id", when: "$schedule.daily.when", root_work_id: "$schedule.WorkId" }, U_W: { $push: { work: { id: "$work_info._id", name: { $toLower: "$work_info.Name" } }, user: { id: "$user_info._id", name: { $toLower: "$user_info.Name" } } } } } }, // 重构成目标输出结构 { $project: { _id: 0, "schedule.WorkId": "$_id.root_work_id", "schedule.daily": [ { when: "$_id.when", U_W: "$U_W" } ] } } ])
逻辑说明
- 两次
$unwind操作分别展开daily和U_W数组,保留每一条U_W记录对应的when字段关联,同时保证每一条待关联记录的workId和userId是绑定的,不会出现交叉匹配 - 两次
$lookup分别对应当前记录的userId和workId做关联,不会产生多余的匹配结果 $group阶段将处理好的单条U_W记录重新按when分组,恢复数组结构- 最后
$project阶段调整字段名和格式,完全匹配你要求的输出结构,用户名和工作名也统一转为小写格式
内容的提问来源于stack exchange,提问作者MrLister
相关产品推荐
相关产品推荐

