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

如何合并MongoDB两个集合并将关联结果转为非数组格式?

解决MongoDB两个集合关联后合并字段的问题

集合结构

Name集合文档结构

{
    "First_Name" : "Smith",
    "Last_Name": "Smiths"
}

Information集合文档结构

{
    "Last_Name": "Smiths",
    "Address": "Some street"
}

你当前用$lookup关联后,返回的关联数据是数组格式,要把Address字段直接合并到主文档里,可采用以下几种方案:

方案1:$unwind + $replaceRoot(通用版本)

先关联集合,展开数组后合并文档字段:

db.Name.aggregate([
  {
    $lookup: {
      from: "Information",
      localField: "Last_Name",
      foreignField: "Last_Name",
      as: "info"
    }
  },
  { $unwind: "$info" },
  {
    $replaceRoot: {
      newRoot: { $mergeObjects: ["$$ROOT", "$info"] }
    }
  },
  { $unset: "info" }
])

方案2:$arrayElemAt + $mergeObjects(简洁版本)

直接取出数组第一个元素,再与主文档合并:

db.Name.aggregate([
  {
    $lookup: {
      from: "Information",
      localField: "Last_Name",
      foreignField: "Last_Name",
      as: "info"
    }
  },
  {
    $addFields: {
      info: { $arrayElemAt: ["$info", 0] }
    }
  },
  {
    $replaceRoot: {
      newRoot: { $mergeObjects: ["$$ROOT", "$info"] }
    }
  },
  { $unset: "info" }
])

方案3:MongoDB 5.0+简化写法

在$lookup的管道内提前处理数据,减少聚合阶段:

db.Name.aggregate([
  {
    $lookup: {
      from: "Information",
      let: { lastName: "$Last_Name" },
      pipeline: [
        { $match: { $expr: { $eq: ["$Last_Name", "$$lastName"] } } },
        { $project: { _id: 0, Last_Name: 0 } }
      ],
      as: "info"
    }
  },
  {
    $replaceRoot: {
      newRoot: { $mergeObjects: ["$$ROOT", { $arrayElemAt: ["$info", 0] }] }
    }
  },
  { $unset: "info" }
])

以上方案执行后,都会返回你期望的格式:

{
    "First_Name" : "Smith",
    "Last_Name": "Smiths",
    "Address": "Some street"
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 21:36:29