MongoDB嵌套数据查询:获取具备Database Design经验的员工姓名
嵌套数组查询:获取具备「Database Design」经验的员工姓名
针对你的集合结构(Employee是顶层数组,每个员工的experience又是内部数组),直接用普通find或简单elemMatch会要么返回空、要么返回整个文档,以下两种方法可以精准获取目标信息:
方法一:使用聚合管道aggregate()
通过展开数组、筛选、投影三步实现,返回结果是每个符合条件的员工单独成文档,结构简洁:
db.empeProject.aggregate([ // 把Employee数组拆成单个员工文档 { $unwind: "$Employee" }, // 筛选出experience包含"Database Design"的员工 { $match: { "Employee.experience": "Database Design" } }, // 只保留姓名字段,隐藏_id { $project: { _id: 0, "Employee.fName": 1, "Employee.lName": 1 } } ])
方法二:使用find()配合数组过滤投影
如果需要保留原文档的其他结构,同时过滤出目标员工,可以在投影里用$filter:
db.empeProject.find( // 先定位存在符合条件员工的文档 { "Employee.experience": "Database Design" }, // 投影时过滤Employee数组,只留下符合经验要求的员工 { _id: 0, targetEmployees: { $filter: { input: "$Employee", cond: { $in: ["Database Design", "$$this.experience"] } } } } ).forEach(doc => { // 遍历输出姓名 doc.targetEmployees.forEach(emp => { console.log(`姓名:${emp.fName} ${emp.lName}`); }); })
注意事项
$unwind会把原文档拆分成多个单员工文档,适合只需要提取目标员工信息的场景;$filter在投影中操作,不会改变原文档的数量,适合需要保留原集合结构的需求。
内容的提问来源于stack exchange,提问作者Sharpy776
相关产品推荐
相关产品推荐

