Files
d1kt/scripts/migrate-word-records.ts

92 lines
3.1 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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);
}
}