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
相关产品推荐
相关产品推荐

