MongoDB 3.4使用带let的$lookup报错,求替代实现方案
MongoDB 3.4 替代 $lookup (let/pipeline) 的实现方案
MongoDB 3.4 仅支持基础版$lookup语法,不支持带let和pipeline的高级关联写法,你可以通过以下步骤实现原查询的逻辑:
- 先用基础$lookup基于
requestId字段关联request集合 - 展开关联后的结果数组,方便后续过滤
- 过滤出
currentUser与request_user的user字段匹配的文档 - 重新聚合回数组结构,保持和原查询一致的输出格式
替代查询代码
db.request_user.aggregate([ // 第一步:基础关联request集合,基于requestId等值匹配 { $lookup: { from: "request", localField: "requestId", foreignField: "requestId", as: "temp_result" } }, // 第二步:展开临时结果数组,便于过滤 { $unwind: "$temp_result" }, // 第三步:过滤currentUser匹配的文档 { $match: { $expr: { $eq: ["$temp_result.currentUser", "$user"] } } }, // 第四步:重新按原文档分组,将匹配的结果聚合为数组 { $group: { _id: "$_id", requestId: { $first: "$requestId" }, user: { $first: "$user" }, // 按需添加原文档其他需要保留的字段 result: { $push: "$temp_result" } } } ])
说明
- 基础$lookup仅支持单字段等值关联,因此先通过
requestId完成集合间的初步关联 $unwind将关联生成的数组拆分为单条文档,才能对currentUser字段做精准过滤$group步骤用于将过滤后的结果重新合并为数组,与原查询as: "result"的输出结构保持一致- 若
request_user文档还有其他需要保留的字段,需在$group阶段通过$first或$last指定保留
内容的提问来源于stack exchange,提问作者Sai T
相关产品推荐
相关产品推荐

