MongoDB聚合查询修改:如何添加组内最低工资员工姓名
解决方案
要在聚合结果中添加每个部门薪资最低的男性员工的firstName,需要对原聚合查询的$group阶段进行扩展,并新增$project阶段来提取目标数据,具体修改如下:
修改后的聚合查询语句
db.employees.aggregate([ { $match: { gender: 'male' } }, { $group: { _id: { deptName: '$department.name' }, totalEmployees: { $sum: 1 }, minSalary: { $min: '$salary' }, // 统计部门内最低薪资 employeeList: { $push: { salary: '$salary', firstName: '$firstName' } } // 收集部门内所有员工的薪资和姓名 } }, { $project: { _id: 1, totalEmployees: 1, lowestSalaryEmployee: { // 过滤出薪资等于最低薪资的员工,取第一个的firstName $arrayElemAt: [ { $map: { input: { $filter: { input: '$employeeList', cond: { $eq: ['$$this.salary', '$minSalary'] } } }, as: 'emp', in: '$$emp.firstName' } }, 0 ] } } }, { $sort: { '_id.deptName': 1 } } ])
语句说明
- $match阶段:保持原逻辑,仅筛选男性员工。
- $group阶段:
- 新增
minSalary字段,用$min运算符获取当前部门的最低薪资。 - 新增
employeeList字段,用$push将部门内每个员工的薪资和姓名存入数组。
- 新增
- $project阶段:
- 通过
$filter从employeeList中筛选出薪资等于minSalary的员工记录。 - 用
$map将筛选后的记录转换为仅包含firstName的数组。 - 最后用
$arrayElemAt取出数组中的第一个姓名(若存在多名薪资相同的最低薪员工,可根据需求调整为返回数组)。
- 通过
- $sort阶段:调整排序字段为
_id.deptName,确保按部门名称升序排列。
预期输出
[ { _id: { deptName: 'Finance' }, totalEmployees: 2, lowestSalaryEmployee: 'Kapil' }, { _id: { deptName: 'HR' }, totalEmployees: 1, lowestSalaryEmployee: 'John' }, { _id: { deptName: 'Marketing' }, totalEmployees: 2, lowestSalaryEmployee: 'Amitabh' } ]
内容的提问来源于stack exchange,提问作者Markus
相关产品推荐
相关产品推荐

