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
相关产品推荐
相关产品推荐

