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

如何在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"
        }
      ]
    }
  }
])
逻辑说明
  1. 两次$unwind操作分别展开daily和U_W数组,保留每一条U_W记录对应的when字段关联,同时保证每一条待关联记录的workId和userId是绑定的,不会出现交叉匹配
  2. 两次$lookup分别对应当前记录的userId和workId做关联,不会产生多余的匹配结果
  3. $group阶段将处理好的单条U_W记录重新按when分组,恢复数组结构
  4. 最后$project阶段调整字段名和格式,完全匹配你要求的输出结构,用户名和工作名也统一转为小写格式

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 23:57:05