关于MongoDB嵌套Aggregate聚合查询时绑定A与C集合数据的疑问
可以实现A集合和C集合的数据绑定,你当前的嵌套$lookup写法只要调整变量传递逻辑就可以满足需求。
你现有代码存在两个问题:
- 内层匹配C的
$eq表达式语法错误,$$bid少了闭合引号 - 没有把A集合的字段变量传递到C的lookup pipeline中,无法直接匹配A和C的关联条件
具体调整方案如下:
你可以在最外层A关联B的$lookup的let参数中声明A集合的字段作为顶层变量,嵌套在内层的所有pipeline都可以直接通过$$前缀访问该变量,不需要层层传递。修正后的参考代码如下:
A.aggregate([ { $lookup: { from: "B", // 声明A集合的aid为顶层变量,内层所有pipeline均可访问 let: { a_aid: "$aid" }, pipeline: [ { $match: { $expr: { $in: ["$_id", "$$a_aid"] } } }, { $lookup: { from: "C", // 传入B的bid和A的a_aid两个变量到当前lookup的pipeline let: { b_bid: "$bid", a_aid: "$$a_aid" }, pipeline: [ { $match: { $expr: { $and: [ // 原有B和C的关联逻辑,按需调整字段名 { $eq: ["$$b_bid", "$bid"] }, // A和C的绑定逻辑,此处示例为C的a_id字段等于A的aid,按需修改对应字段即可 { $eq: ["$$a_aid", "$a_id"] } ] } } } ], as: "c_list" } } ], as: "b_list" } } ])
如果你不需要保留B集合的关联中间结果,也可以选择平级写两次$lookup:先关联B集合,再用$unwind展开B的关联结果,之后再关联C集合同时绑定A的字段条件,两种写法都可以实现需求,你可以根据后续数据处理的场景选择更合适的方案。
内容的提问来源于stack exchange,提问作者extradeck
相关产品推荐
相关产品推荐

