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

MongoDB聚合查询:关联数组中子字段并保留level字段

解决MongoDB聚合中关联嵌套数组并保留字段结构的问题

你的问题核心是直接使用$lookup关联嵌套数组内的字段时,会破坏原有数组结构,丢失level与关联文档的对应关系。正确做法是先拆分数组,关联后再重组,具体聚合流程如下:

完整聚合语句

[
  // 拆分skills数组,将每个skill项转为独立文档
  { $unwind: "$skills" },
  // 关联Skill集合,替换skills.skill为对应的文档
  {
    $lookup: {
      from: "Skill",
      localField: "skills.skill",
      foreignField: "_id",
      as: "skills.skill"
    }
  },
  // 将lookup返回的数组转为单个文档对象
  { $set: { "skills.skill": { $first: "$skills.skill" } } },
  // 按用户ID重组文档,恢复skills数组结构
  {
    $group: {
      _id: "$_id",
      // 保留用户其他原始字段,用$first取原始值
      otherProperties: { $first: "$otherProperties" },
      skills: { $push: "$skills" }
    }
  }
]

各阶段说明

  1. $unwind: "$skills"
    将用户文档中的skills数组拆分为多个文档,每个文档仅包含一个skills对象(含原skill和level字段),确保后续$lookup能精准关联单个skill项。

  2. $lookup
    此时localField指向拆分后的单个skills.skill ObjectId,关联Skill集合后,匹配的文档数组会存入skills.skill字段。

  3. $set: { "skills.skill": { $first: "$skills.skill" } }
    由于$lookup默认返回数组(即使仅一个匹配项),用$first取出数组首个元素,将skills.skill转为单个文档对象,契合预期结构。

  4. $group
    按用户_id分组,把处理后的skills对象重新push为数组,同时用$first保留用户其他原始字段(示例中otherProperties需替换为你的真实字段)。

执行以上聚合后,即可得到目标结果:每个skills项既包含关联后的完整Skill文档,又保留了对应的level字段。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 20:34:50