如何编写MongoDB聚合查询实现$lookup关联后匹配嵌套字段cAccessName
MongoDB关联集合字段匹配修改方案
错误原因
- 匹配阶段顺序错误:你当前将针对关联后字段的过滤条件放在了
$lookup、$unwind阶段前,此时原始Permission集合文档还没有生成oAccessTypeListing字段,自然无法匹配到对应值 - 字段路径错误:
cAccessName是oAccessTypeListing的嵌套属性,直接写字段名无法识别,需要写完整嵌套路径
代码修改
1. 修正过滤查询写法
cSearchFilterQuery = { $match: { $or: [{ "oAccessTypeListing.cAccessName": { "$regex": 'filter string', "$options": "i" } }] } };
2. 调整聚合管道顺序、优化异步写法
你原来同时使用await和回调函数的写法逻辑有误,回调返回值不会被await接收,直接用try catch捕获异常即可,同时将关联字段的过滤条件放到$unwind之后:
private async FunDCT_GetPermissionCount(cSearchFilterQuery) { try { const oCount = await Permission.aggregate([ { $lookup: { from: "gen_accesstypes", localField: "iAccessTypeID", foreignField: "_id", as: "oAccessTypeListing" } }, { $unwind: "$oAccessTypeListing" }, cSearchFilterQuery ]); return oCount.length; } catch (err) { return false; } }
性能优化建议
如果你同时需要过滤Permission集合的原生字段,可以将这部分过滤条件单独放在$lookup之前,先过滤无效文档减少后续关联计算量:
private async FunDCT_GetPermissionCount(originFilter, accessTypeFilter) { try { const oCount = await Permission.aggregate([ originFilter, // 原生字段过滤 示例:{ $match: { cView: "Y" } } { $lookup: { from: "gen_accesstypes", localField: "iAccessTypeID", foreignField: "_id", as: "oAccessTypeListing" } }, { $unwind: "$oAccessTypeListing" }, accessTypeFilter // 关联后字段过滤 ]); return oCount.length; } catch (err) { return false; } }
内容的提问来源于stack exchange,提问作者Brijesh Kalkani
相关产品推荐
相关产品推荐

