MongoDB新手技术求助:关联employees与assign_work集合查询已分配任务的员工数据
解决MongoDB跨集合查询已分配任务员工的问题
嘿,我来帮你搞定这个查询问题!你现在的问题在于employees和assign_work是两个独立的集合,不是嵌套在同一个文档里的结构,所以直接在employees里查询assigned_work.progress肯定拿不到结果——因为employees集合根本没有这个字段呀😅
下面给你两种可行的解决方案,你可以根据自己的场景选择:
方法一:使用聚合管道的$lookup关联集合
这种方法适合需要一次性完成查询的场景,通过聚合管道把两个集合关联起来,再过滤条件:
db.employees.aggregate([ // 第一步:关联assign_work集合,通过empno字段匹配员工和任务 { $lookup: { from: "assign_work", localField: "empno", foreignField: "empno", as: "assigned_tasks" } }, // 第二步:过滤出至少有一个任务状态为"Assigned"的员工 { $match: { "assigned_tasks.progress": "Assigned" } }, // 可选:如果你只想保留employees的原始数据,去掉关联的任务信息,就加上这个阶段 { $project: { assigned_tasks: 0 } } ])
代码解释:
$lookup会把每个员工对应的所有任务从assign_work集合中查询出来,放到一个名为assigned_tasks的数组字段里;$match会筛选出assigned_tasks数组中至少有一条记录的progress等于"Assigned"的员工;- 最后的
$project是可选的,如果你不需要看到关联的任务数据,只保留员工的原始信息,就加上这一步。
方法二:先获取已分配任务的员工编号,再查询员工数据
这种方法更直观,分两步执行,适合数据量不大的场景:
// 第一步:从assign_work集合中取出所有状态为"Assigned"的员工编号 var assignedEmpNos = db.assign_work.find( { progress: "Assigned" }, { empno: 1, _id: 0 } // 只返回empno字段,不返回_id ).map(doc => doc.empno); // 把查询结果转换成empno的数组 // 第二步:用拿到的员工编号数组查询employees集合 db.employees.find({ empno: { $in: assignedEmpNos } })
代码解释:
- 第一步先筛选出所有已分配任务的员工编号,存到
assignedEmpNos数组里; - 第二步用
$in操作符,在employees集合中查询编号在这个数组里的员工,就能得到你想要的结果。
这两种方法都能解决你的问题,你可以根据自己的需求选择使用哦!
内容的提问来源于stack exchange,提问作者techshot nextgen
相关产品推荐
相关产品推荐

