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

MongoDB聚合查询:关联pay与tickets集合匹配_id补全字段

MongoDB聚合关联pay与tickets集合

要实现将pay集合中tickets数组元素与tickets集合关联、补全对应字段的需求,可通过aggregate结合$lookup、$map、$mergeObjects等操作完成,具体聚合管道如下:

db.pay.aggregate([
  // 关联tickets集合,获取所有匹配的票务文档
  {
    $lookup: {
      from: "tickets",
      let: { ticketIds: "$tickets._id" },
      pipeline: [
        { $match: { $expr: { $in: ["$_id", "$$ticketIds"] } } }
      ],
      as: "fullTickets"
    }
  },
  // 替换原tickets数组,合并关联到的字段
  {
    $project: {
      tickets: {
        $map: {
          input: "$tickets",
          as: "originalTicket",
          in: {
            $mergeObjects: [
              "$$originalTicket",
              { $arrayElemAt: [
                { $filter: {
                    input: "$fullTickets",
                    cond: { $eq: ["$$this._id", "$$originalTicket._id"] }
                  }
                },
                0
              ] }
            ]
          }
        }
      }
    }
  }
])

逻辑说明

  1. $lookup阶段:定义变量ticketIds获取当前pay文档中tickets数组的所有ID,在tickets集合中匹配这些ID,将完整票务文档存入临时字段fullTickets。
  2. $project阶段:用$map遍历原tickets数组,对每个元素通过$filter从fullTickets中匹配对应ID的文档,再用$mergeObjects合并原元素与完整文档,最终替换原tickets字段。

执行后将得到期望输出:

{
  _id: ObjectId("121"),
  tickets: [
    {
      _id: ObjectId("1"),
      name: "xyz"
    }
  ]
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 04:27:45