MongoDB同查询中结合$lookup与$arrayElemAt过滤dept指定值
MongoDB关联筛选问题解决方案
问题原因
你之前添加$match未生效大概率是匹配阶段的位置和字段匹配方式不对:$lookup返回的dept初始是数组类型,未做字段提取前直接匹配字符串会匹配失败。
方案1:在现有代码基础上新增$match阶段
你可以直接在现有聚合管道的$project阶段后新增筛选阶段,此时dept已经被$arrayElemAt处理为字符串类型,直接匹配即可:
db.pracownicy.aggregate([ { $lookup: { from: "zespoly", localField: "id_zesp", foreignField: "id_zesp", as: "dept" } }, { $project: { _id: 0, "id_zesp": 1, "nazwisko": 1, "dept": {$arrayElemAt:["$dept.nazwa", 0]} } }, // 新增筛选阶段 { $match: { dept: "SYSTEMY EKSPERCKIE" } } ])
方案2:性能优化版(提前筛选减少关联数据)
如果数据量较大,可以先筛选出目标部门再关联,减少不必要的计算:
db.pracownicy.aggregate([ // 先筛选属于目标部门的员工,减少后续关联的数据量 { $match: { id_zesp: 30 } }, { $lookup: { from: "zespoly", localField: "id_zesp", foreignField: "id_zesp", as: "dept" } }, { $project: { _id: 0, "id_zesp": 1, "nazwisko": 1, "dept": {$arrayElemAt:["$dept.nazwa", 0]} } } ])
执行结果
两种方案都会返回你需要的目标数据:
{ "nazwisko" : "SLOWINSKI", "id_zesp" : 30, "dept" : "SYSTEMY EKSPERCKIE" } { "nazwisko" : "ZAKRZEWICZ", "id_zesp" : 30, "dept" : "SYSTEMY EKSPERCKIE" } { "nazwisko" : "BIALY", "id_zesp" : 30, "dept" : "SYSTEMY EKSPERCKIE" } { "nazwisko" : "HAPKE", "id_zesp" : 30, "dept" : "SYSTEMY EKSPERCKIE" }
内容的提问来源于stack exchange,提问作者DefinitelyNotAHacker
相关产品推荐
相关产品推荐

