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 ] } ] } } } } } ])
逻辑说明
- $lookup阶段:定义变量
ticketIds获取当前pay文档中tickets数组的所有ID,在tickets集合中匹配这些ID,将完整票务文档存入临时字段fullTickets。 - $project阶段:用
$map遍历原tickets数组,对每个元素通过$filter从fullTickets中匹配对应ID的文档,再用$mergeObjects合并原元素与完整文档,最终替换原tickets字段。
执行后将得到期望输出:
{ _id: ObjectId("121"), tickets: [ { _id: ObjectId("1"), name: "xyz" } ] }
内容的提问来源于stack exchange,提问作者raghav Aggarwal
相关产品推荐
相关产品推荐

