MongoDB反向查询:为Order子文档Task关联对应TaskInvites
如何将TaskInvite关联到Order的对应Task子文档中
你当前的聚合查询会把符合条件的TaskInvite统一放到根层级的invites字段,无法和对应的Task子文档关联。要实现每个Task下挂载其对应的有效TaskInvite,需要调整聚合流程,步骤如下:
修正后的聚合代码
const order = await this.orderModel.aggregate([ // 1. 过滤目标订单 { $match: { _id: orderId } }, // 2. 拆分tasks数组,让每个文档对应单个task { $unwind: { path: '$tasks', preserveNullAndEmptyArrays: true } }, // 3. 为每个task关联对应的有效TaskInvite { $lookup: { from: 'taskinvites', localField: 'tasks._id', foreignField: 'task', // 对应TaskInvite的task字段,替换你原代码错误的invite as: 'tasks.invites', // 直接将结果挂载到当前task的invites字段 pipeline: [ { $match: { $expr: { $in: ['$status', [TaskInviteStatus.ACCEPTED, TaskInviteStatus.UNDER_REVIEW]] } } } ] } }, // 4. 将拆分后的文档重新聚合为原订单结构,恢复tasks数组 { $group: { _id: '$_id', tasks: { $push: '$tasks' }, // 若订单有其他需要保留的字段,在此添加,示例: // name: { $first: '$name' } } } ])
关键说明
- $unwind拆分tasks:先把tasks数组拆分成单个文档,才能为每个task单独关联邀请数据,避免根层级的批量关联。
- lookup字段修正:
- 原代码
localField: 'tasks$._id'写法错误,unwind后直接用tasks._id即可关联当前task的ID。 - foreignField要对应TaskInvite Schema里的
task字段(你的示例中是task: 1),而非错误的invite。
- 原代码
- $group重组订单:通过
$push把携带invites的单个task重新组合成tasks数组,恢复原Order的结构。
内容的提问来源于stack exchange,提问作者Ashish
相关产品推荐
相关产品推荐

