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

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' }
    }
  }
])

关键说明

  1. $unwind拆分tasks:先把tasks数组拆分成单个文档,才能为每个task单独关联邀请数据,避免根层级的批量关联。
  2. lookup字段修正:
    • 原代码localField: 'tasks$._id'写法错误,unwind后直接用tasks._id即可关联当前task的ID。
    • foreignField要对应TaskInvite Schema里的task字段(你的示例中是task: 1),而非错误的invite。
  3. $group重组订单:通过$push把携带invites的单个task重新组合成tasks数组,恢复原Order的结构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 06:09:24