92 lines
3.1 KiB
TypeScript
92 lines
3.1 KiB
TypeScript
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);
|
||
}
|
||
}
|