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

MongoDB中$lookup管道如何匹配祖父级文档的字段值?

解决MongoDB嵌套聚合查询中跨层级字段匹配问题

你的问题出在嵌套$lookup的变量传递上:内层的rental_payment查询里,你用的$$issue_from指向的是rental_contract文档的issue_from字段,而非祖父级rental_receipt的对应字段。需要把最外层的变量逐层传递到内层查询中。

修改后的聚合查询代码如下:

let rental_receipts = await this.req.db.collection('rental_receipt').aggregate([
  {
    '$lookup': {
      from: 'rental_contract',
      localField: 'rental_contract',
      foreignField: '_id',
      as: 'rental_contract',
      // 定义来自rental_receipt的issue_from变量
      let: { receipt_issue_from: '$issue_from' },
      pipeline: [
        {
          '$lookup': {
            from: 'rental_payment',
            localField: '_id',
            foreignField: 'rental_contract',
            as: 'rental_payments',
            // 引用上层传递下来的receipt_issue_from变量
            let: { receipt_issue_from: '$$receipt_issue_from' },
            pipeline: [
              {
                '$match': {
                  // 匹配rental_payment的issue_from与祖父级的receipt_issue_from
                  '$expr': { '$eq': ['$issue_from', '$$receipt_issue_from'] }
                }
              },
            ]
          }
        },
      ]
    }
  },
]).toArray();

关键修改点:

  • 最外层$lookup的let变量重命名为receipt_issue_from,明确指向rental_receipt的字段
  • 内层rental_payment的$lookup中,let引用上层的$$receipt_issue_from,而非当前rental_contract的字段
  • $match使用$expr来实现字段与变量的比较(MongoDB要求在$match中使用变量时必须配合$expr)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 01:17:22