MongoDB $lookup匹配后仅返回关联字段FieldCollege非空的class记录问题
MongoDB关联查询筛选问题解决方案
这个筛选需求MongoDB完全支持,问题出在你写的$match筛选条件和实际字段值不匹配。
问题原因
你在$addFields阶段使用了$arrayElemAt取过滤后数组的第一个元素,当没有符合level条件的关联数据时,$arrayElemAt([], 0)会返回null,而非空数组,所以你之前写的$ne: []筛选条件自然无法命中需要排除的记录。
修复方案
方案1:直接修改$match阶段(改动最小)
把原有$match的筛选条件改为判断FieldCollege不为null即可:
{ $match: { 'FieldCollege': { $ne: null } } }
方案2:优化聚合逻辑(性能更高)
你可以把level的过滤条件直接放到$lookup的pipeline中,不用先查询全部关联数据再做二次过滤,数据量大时性能优势更明显:
{ $lookup: { from: 'fields', let: { fieldId: "$field" }, pipeline: [ { $match: { $expr: { $eq: ["$_id", "$$fieldId"] }, level: req.query.level } }, { $limit: 1 } // 仅取第一条匹配的记录 ], as: 'FieldCollege' } }, { // 把单元素数组转换为对象,无匹配时返回null $addFields: { FieldCollege: { $arrayElemAt: ["$FieldCollege", 0] } } }, { $match: { FieldCollege: { $ne: null } } }
内容的提问来源于stack exchange,提问作者Chinese_hacker_lm
相关产品推荐
相关产品推荐

