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

MongoDB中如何基于关联集合过滤获取无指定头衔的员工姓名

嘿,我来帮你搞定这个MongoDB的查询需求!结合你给出的Employee和Role集合数据,这里有两种实用的方法可以获取所有没有"software engineer"头衔的员工姓名:

方法1:使用聚合管道(一站式查询)

这种方法可以通过一次聚合操作直接得到你想要的数组结果,非常高效:

db.Employee.aggregate([
  // 关联Employee和Role集合,把匹配的角色放到roles数组
  {
    $lookup: {
      from: "Role",
      localField: "id",
      foreignField: "employee_id",
      as: "roles"
    }
  },
  // 筛选出roles中没有software engineer头衔的员工
  {
    $match: {
      "roles.title": { $ne: "software engineer" }
    }
  },
  // 只保留name字段,去掉默认的_id
  {
    $project: {
      _id: 0,
      name: 1
    }
  },
  // 把所有姓名聚合到一个数组里
  {
    $group: {
      _id: null,
      result: { $push: "$name" }
    }
  },
  // 去掉_id,只返回结果数组
  {
    $project: {
      _id: 0,
      result: 1
    }
  }
])

执行后会直接返回:{ "result": ["Lisa", "Nick"] },完全符合你的预期。

方法2:分步查询(更灵活)

如果需要复用拥有"software engineer"头衔的员工ID列表,这种分步的方式会更合适:

第一步:获取所有拥有software engineer头衔的员工ID

const seEmployeeIds = db.Role.distinct("employee_id", { title: "software engineer" })
// 执行后得到:["001", "003"]

第二步:查询Employee集合,排除上述ID并提取姓名

const result = db.Employee.find(
  { id: { $nin: seEmployeeIds } }, // $nin表示"不在此列表中"
  { _id: 0, name: 1 } // 只返回name字段
).toArray().map(doc => doc.name)

// 最终result就是:["Lisa", "Nick"]

两种方法都能完美满足你的需求,你可以根据实际场景选择使用~

内容的提问来源于stack exchange,提问作者Claire Duong

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 14:02:33