Migrate project from typing_practiceweb
This commit is contained in:
91
scripts/migrate-word-records.ts
Normal file
91
scripts/migrate-word-records.ts
Normal file
@@ -0,0 +1,91 @@
|
||||
import mongoose from 'mongoose';
|
||||
import { config } from '../server/config';
|
||||
// 连接数据库
|
||||
mongoose.connect(config.MONGODB_URI)
|
||||
.then(() => {
|
||||
console.log('数据库连接成功,开始迁移...');
|
||||
migrateWordRecords();
|
||||
}).catch(err => {
|
||||
console.error('数据库连接失败:', err);
|
||||
process.exit(1);
|
||||
});
|
||||
|
||||
// 导入 Vocabulary 模型定义
|
||||
import '../server/models/Vocabulary'; // 确保模型已注册
|
||||
|
||||
async function migrateWordRecords() {
|
||||
try {
|
||||
// 获取WordRecord模型
|
||||
const WordRecord = mongoose.model('WordRecord');
|
||||
|
||||
// 获取所有WordRecord记录
|
||||
console.log('正在获取所有单词记录...');
|
||||
const records = await WordRecord.find({});
|
||||
console.log(`共找到 ${records.length} 条记录需要迁移`);
|
||||
|
||||
// 批量处理,每批次1000条
|
||||
const batchSize = 1000;
|
||||
const totalBatches = Math.ceil(records.length / batchSize);
|
||||
|
||||
for (let batchIndex = 0; batchIndex < totalBatches; batchIndex++) {
|
||||
const start = batchIndex * batchSize;
|
||||
const end = Math.min(start + batchSize, records.length);
|
||||
const batch = records.slice(start, end);
|
||||
|
||||
console.log(`处理批次 ${batchIndex + 1}/${totalBatches}, 记录 ${start + 1} 到 ${end}`);
|
||||
|
||||
const updatePromises = batch.map(async (record) => {
|
||||
try {
|
||||
// 判断是否全部掌握
|
||||
const modes = ['chineseToEnglish', 'audioToEnglish', 'multipleChoice'];
|
||||
const isFullyMastered = modes.every(mode => record[mode]?.mastered === true);
|
||||
|
||||
// 如果全部掌握,找出最近的掌握时间
|
||||
let lastFullyMasteredAt: Date | null = null;
|
||||
if (isFullyMastered) {
|
||||
let latestDate: Date | null = null;
|
||||
modes.forEach(mode => {
|
||||
const modeDate = record[mode]?.lastMasteredAt;
|
||||
if (modeDate && (!latestDate || modeDate > latestDate)) {
|
||||
latestDate = modeDate;
|
||||
}
|
||||
});
|
||||
lastFullyMasteredAt = latestDate;
|
||||
}
|
||||
|
||||
// 修复: 显式定义updateData类型
|
||||
const updateData: {
|
||||
isFullyMastered: boolean;
|
||||
lastFullyMasteredAt?: Date
|
||||
} = {
|
||||
isFullyMastered: isFullyMastered
|
||||
};
|
||||
|
||||
if (lastFullyMasteredAt) {
|
||||
updateData.lastFullyMasteredAt = lastFullyMasteredAt;
|
||||
}
|
||||
|
||||
// 执行更新
|
||||
await WordRecord.updateOne({ _id: record._id }, { $set: updateData });
|
||||
return true;
|
||||
} catch (error) {
|
||||
console.error(`更新记录 ${record._id} 失败:`, error);
|
||||
return false;
|
||||
}
|
||||
});
|
||||
|
||||
// 等待批次完成
|
||||
const results = await Promise.all(updatePromises);
|
||||
const successCount = results.filter(Boolean).length;
|
||||
console.log(`批次 ${batchIndex + 1} 完成: ${successCount}/${batch.length} 条记录成功更新`);
|
||||
}
|
||||
|
||||
console.log('迁移完成!');
|
||||
mongoose.connection.close();
|
||||
process.exit(0);
|
||||
} catch (error) {
|
||||
console.error('迁移过程中发生错误:', error);
|
||||
mongoose.connection.close();
|
||||
process.exit(1);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user