实现 mongodb 双表统计部门人数

一、流程图

flowchart TD
    A[连接到 MongoDB 数据库] --> B[查询员工表,获取所有部门名称]
    B --> C[遍历部门名称,统计每个部门的人数]
    C --> D[创建部门统计表,插入每个部门的统计结果]

二、具体步骤

1. 连接到 MongoDB 数据库

首先,我们需要连接到 MongoDB 数据库,使用 MongoDB 的官方驱动程序来实现。可以使用如下代码连接到 MongoDB:

const { MongoClient } = require('mongodb');

// 连接到 MongoDB
const client = new MongoClient('mongodb://localhost:27017', { useNewUrlParser: true, useUnifiedTopology: true });

// 连接到数据库
client.connect((err) => {
    if (err) {
        console.error('Failed to connect to MongoDB:', err);
        return;
    }
    console.log('Connected to MongoDB');

    // 在此处执行查询和统计的代码
});

2. 查询员工表,获取所有部门名称

接下来,我们需要查询员工表,获取所有的部门名称。假设员工表的集合名为 employees,部门名称字段为 department。我们可以使用 MongoDB 的 distinct 方法来获取所有的部门名称:

// 查询员工表,获取所有部门名称
const db = client.db('mydb'); // 替换为你的数据库名称
const collection = db.collection('employees'); // 替换为你的集合名称

collection.distinct('department', (err, departments) => {
    if (err) {
        console.error('Failed to get departments:', err);
        return;
    }
    console.log('Departments:', departments);

    // 在此处执行统计部门人数的代码
});

3. 遍历部门名称,统计每个部门的人数

接下来,我们需要遍历部门名称,统计每个部门的人数。我们可以使用 MongoDB 的 countDocuments 方法来统计满足条件的文档数量,即部门为当前遍历的部门名称。然后,我们可以将部门名称和人数保存到一个对象中,方便后续插入到部门统计表中:

const departmentCounts = {};

// 遍历部门名称,统计人数
departments.forEach((department) => {
    collection.countDocuments({ department }, (err, count) => {
        if (err) {
            console.error(`Failed to count employees in department ${department}:`, err);
            return;
        }
        console.log(`Number of employees in department ${department}:`, count);

        // 保存部门名称和人数
        departmentCounts[department] = count;

        // 在此处执行创建部门统计表和插入数据的代码
    });
});

4. 创建部门统计表,插入每个部门的统计结果

最后,我们需要创建部门统计表,并将每个部门的统计结果插入到表中。假设部门统计表的集合名为 department_counts,包含两个字段 departmentcount。可以使用 MongoDB 的 insertMany 方法来执行批量插入操作:

// 创建部门统计表,插入数据
const departmentCountsCollection = db.collection('department_counts'); // 替换为你的集合名称

// 将部门名称和人数插入部门统计表
const departmentCountsArray = Object.entries(departmentCounts).map(([department, count]) => ({ department, count }));
departmentCountsCollection.insertMany(departmentCountsArray, (err, result) => {
    if (err) {
        console.error('Failed to insert department counts:', err);
        return;
    }
    console.log('Department counts inserted:', result.insertedCount);

    // 在此处可以关闭数据库连接
});

三、完整代码

const { MongoClient } = require('mongodb');

// 连接到 MongoDB
const client = new MongoClient('mongodb://localhost:27017', { useNewUrlParser: true, useUnifiedTopology: true });

// 连接到数据库
client.connect((err) => {
    if (err) {
        console.error('Failed to connect to MongoDB:', err);
        return;
    }
    console.log('Connected to MongoDB');

    // 查询员工表,获取所有部门名称
    const db = client.db('mydb'); // 替换为你的数据库名称
    const collection = db.collection('employees'); // 替换为你的集合名称

    collection.distinct('department',