如何用Python的PyMongo实现MongoDB一对多查询及员工最多部门统计
用PyMongo找出员工数量最多的部门
完整实现代码
以下是包含MongoDB连接、演示数据插入及核心查询逻辑的完整代码:
from pymongo import MongoClient # 连接本地MongoDB实例(远程/带认证的话,修改此处参数即可) client = MongoClient('mongodb://localhost:27017/') db = client['Mongodb_demo'] # 获取对应集合 employee_col = db['employee'] department_col = db['department'] # 插入演示数据(数据已存在可跳过,先清空集合避免重复) department_data = [ {'depid': 1.0, 'deptname': 'Marketing', 'dept_description': 'This is Marketing department.'}, {'depid': 2.0, 'deptname': 'HR', 'dept_description': 'This is Human Resource department.'}, {'depid': 3.0, 'deptname': 'Operations', 'dept_description': 'This is Operations department.'} ] employee_data = [ {'employeename': 'Rohan Patil', 'sal': 50000.0, 'employeeid': 'rohan.patil.512', 'depid': 2.0}, {'employeename': 'Goldy Sharma', 'sal': 40000.0, 'employeeid': 'goldy.sharma.513', 'depid': 2.0}, {'employeename': 'Venugopal Ayeer', 'sal': 45000.0, 'employeeid': 'venugopal.ayeer.511', 'depid': 2.0}, {'employeename': 'Sudha Murti', 'sal': 45000.0, 'employeeid': 'sudha.murti.514', 'depid': 3.0}, {'employeename': 'Rajesh Kumar', 'sal': 38000.0, 'employeeid': 'rajesh.kumar.515', 'depid': 1.0} ] employee_col.delete_many({}) department_col.delete_many({}) department_col.insert_many(department_data) employee_col.insert_many(employee_data) # 构建聚合查询管道 pipeline = [ # 按部门ID统计员工数量 { '$group': { '_id': '$depid', 'employee_count': {'$sum': 1} } }, # 关联部门集合获取详细信息 { '$lookup': { 'from': 'department', 'localField': '_id', 'foreignField': 'depid', 'as': 'dept_details' } }, # 展开关联的部门信息数组 {'$unwind': '$dept_details'}, # 按员工数降序排序 {'$sort': {'employee_count': -1}}, # 只取排名第一的结果 {'$limit': 1}, # 整理输出格式 { '$project': { '_id': 0, '部门ID': '$_id', '部门名称': '$dept_details.deptname', '部门描述': '$dept_details.dept_description', '员工数量': '$employee_count' } } ] # 执行查询并转换为Python列表 result = list(employee_col.aggregate(pipeline)) # 输出结果 print("员工数量最多的部门:") print(result)
关键逻辑说明
- 聚合管道拆解:
$group:按depid分组,统计每个部门的员工总数$lookup:关联department集合,匹配部门的详细信息$unwind:将关联得到的数组格式部门信息展开为单个文档$sort:按员工数量降序排列,确保最多的部门排在首位$limit:仅保留第一条结果,即员工数最多的部门$project:自定义输出字段名和格式,让结果更易读
- 结果转换:用
list()将MongoDB返回的游标对象转换为Python列表,方便后续处理或输出
运行结果
执行代码后会得到如下Python格式的结果:
[ { '部门ID': 2.0, '部门名称': 'HR', '部门描述': 'This is Human Resource department.', '员工数量': 3 } ]
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

