91 lines
3.0 KiB
JavaScript
91 lines
3.0 KiB
JavaScript
const { MongoClient } = require("mongodb");
|
||
const XLSX = require("xlsx");
|
||
|
||
const uri = "mongodb://192.168.0.89:27017/typeskill"; // MongoDB 连接 URI
|
||
const dbName = "typeskill"; // 数据库名
|
||
const usersCollectionName = "users"; // 用户集合名
|
||
const recordsCollectionName = "practicerecords"; // 练习记录集合名
|
||
|
||
async function exportToExcel() {
|
||
const client = new MongoClient(uri);
|
||
|
||
try {
|
||
console.log("连接到 MongoDB...");
|
||
await client.connect();
|
||
console.log("MongoDB 连接成功!");
|
||
|
||
const db = client.db(dbName);
|
||
const usersCollection = db.collection(usersCollectionName);
|
||
const recordsCollection = db.collection(recordsCollectionName);
|
||
|
||
// **步骤 1:提取用户数据**
|
||
console.log("开始提取用户数据...");
|
||
const users = await usersCollection
|
||
.find({ username: { $regex: /^(202310|202410)/ } }, { projection: { username: 1, fullname: 1 } })
|
||
.toArray();
|
||
|
||
console.log(`共找到 ${users.length} 位用户:`, users);
|
||
|
||
// **步骤 2:提取练习记录数据**
|
||
console.log("开始提取练习记录数据...");
|
||
const pipeline = [
|
||
{
|
||
$match: {
|
||
username: { $regex: /^(202310|202410)/ }, // 匹配 username 以 202310 或 202410 开头
|
||
"stats.startTime": { $gte: new Date("2024-12-21T00:00:00Z") } // startTime 条件
|
||
}
|
||
},
|
||
{
|
||
$group: {
|
||
_id: "$username", // 按 username 分组
|
||
totalCorrectWords: { $sum: "$stats.correctWords" } // 汇总 correctWords
|
||
}
|
||
},
|
||
{
|
||
$sort: { _id: 1 } // 按 username 升序排序
|
||
}
|
||
];
|
||
|
||
const records = await recordsCollection.aggregate(pipeline).toArray();
|
||
|
||
console.log(`共找到 ${records.length} 条练习记录:`, records);
|
||
|
||
// **步骤 3:匹配用户和练习记录,并计算等级**
|
||
console.log("开始匹配用户、练习记录,并计算等级...");
|
||
const usernameToRecordMap = new Map();
|
||
records.forEach(record => {
|
||
usernameToRecordMap.set(record._id, record.totalCorrectWords);
|
||
});
|
||
|
||
const finalData = users.map(user => {
|
||
const correctWords = usernameToRecordMap.get(user.username) || 0; // 如果没有记录,设置为 0
|
||
const grade = correctWords >= 150 ? "A" : "B"; // 计算等级
|
||
return {
|
||
Username: user.username,
|
||
Fullname: user.fullname || "N/A",
|
||
CorrectWords: correctWords,
|
||
Grade: grade
|
||
};
|
||
});
|
||
|
||
console.log("匹配完成,准备导出数据:", finalData);
|
||
|
||
// **步骤 4:生成 Excel 文件**
|
||
const worksheet = XLSX.utils.json_to_sheet(finalData);
|
||
const workbook = XLSX.utils.book_new();
|
||
XLSX.utils.book_append_sheet(workbook, worksheet, "StudentRecords");
|
||
|
||
const filePath = "./student_records_with_grades.xlsx";
|
||
XLSX.writeFile(workbook, filePath);
|
||
|
||
console.log(`Excel 文件已生成: ${filePath}`);
|
||
} catch (err) {
|
||
console.error("出错了:", err);
|
||
} finally {
|
||
await client.close();
|
||
console.log("MongoDB 连接已关闭!");
|
||
}
|
||
}
|
||
|
||
exportToExcel();
|