You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 10:03:13