如何使用MongoDB聚合管道查询各类型下收入最高的前10位人员
解决MongoDB按类型取收入Top10人员的聚合方案
嘿,这个需求用MongoDB的聚合框架就能完美实现,我给你一步步拆解具体的实现思路和查询语句:
核心思路
我们需要先按Type字段分组,把每个类型下的所有人员收入信息聚合到一起,然后在每个分组内对收入进行降序排序,最后截取前10条数据即可。
适用于MongoDB 5.2+版本的简洁写法
MongoDB 5.2新增了$sortArray操作符,能直接在数组上排序,让整个聚合流程更简洁:
db.your_collection_name.aggregate([ // 第一步:按Type分组,收集每个类型下的人员姓名和收入 { $group: { _id: "$Type", people: { $push: { person_name: "$Person_name", income: "$Income" } } } }, // 第二步:对每个分组的人员数组按收入降序排序,然后取前10 { $project: { type: "$_id", // 保留类型字段,让结果更直观 top_10_highest_income: { $slice: [ { $sortArray: { input: "$people", sortBy: { income: -1 } // -1表示降序,1为升序 } }, 10 // 截取前10条 ] }, _id: 0 // 隐藏默认的_id字段 } } ])
适用于MongoDB 5.2以下版本的兼容写法
如果你的MongoDB版本较低,不支持$sortArray,可以用$unwind+$sort+$group的组合来实现:
db.your_collection_name.aggregate([ // 第一步:按Type和Person_name分组(确保每个人员唯一) { $group: { _id: { type: "$Type", name: "$Person_name" }, income: { $first: "$Income" } } }, // 第二步:按Type分组,收集人员信息 { $group: { _id: "$_id.type", people: { $push: { person_name: "$_id.name", income: "$income" } } } }, // 第三步:拆分人员数组为单个文档 { $unwind: "$people" }, // 第四步:按Type分组,同时对组内人员按收入降序排序并取前10 { $group: { _id: "$_id", top_10_highest_income: { $push: "$people" } } }, // 第五步:排序并截取前10 { $project: { type: "$_id", top_10_highest_income: { $slice: [ { $sort: { "top_10_highest_income.income": -1 } }, 10 ] }, _id: 0 } } ])
补充说明
- 记得把
your_collection_name替换成你实际的集合名称 - 如果存在同一人员同一类型下多条收入记录的情况,建议在第一步分组时先按
Type和Person_name聚合,用$sum或$first处理重复的收入(比如取总和或最新一条) - 排序时
income字段如果是数值类型才能正确排序,确保你的数据类型是Number而非字符串
内容的提问来源于stack exchange,提问作者vijay lather
相关产品推荐
相关产品推荐

