实现 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
,包含两个字段 department
和 count
。可以使用 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',