diff --git a/MONGODB_INDEXES.md b/MONGODB_INDEXES.md index 35e8acb..5010e1c 100644 --- a/MONGODB_INDEXES.md +++ b/MONGODB_INDEXES.md @@ -44,6 +44,8 @@ db.jimeng_free_generation_tasks.createIndex({ db.jimeng_free_generation_results.createIndex({ "task_id": 1 }, { unique: true }); db.jimeng_free_generation_results.createIndex({ "server_id": 1 }); db.jimeng_free_generation_results.createIndex({ "created_at": 1 }); +db.jimeng_free_generation_results.createIndex({ "is_read": 1 }); +db.jimeng_free_generation_results.createIndex({ "first_read_at": 1 }); // TTL索引 - 自动清理过期记录 db.jimeng_free_generation_results.createIndex({ @@ -57,6 +59,12 @@ db.jimeng_free_generation_results.createIndex({ "server_id": 1, "created_at": 1 }); + +// 复合索引 - 用于查询已读取/未读取的结果 +db.jimeng_free_generation_results.createIndex({ + "is_read": 1, + "created_at": 1 +}); ``` ### 3. 服务器心跳表 (jimeng_servers) @@ -97,8 +105,11 @@ print("创建生成结果表索引..."); db.jimeng_free_generation_results.createIndex({ "task_id": 1 }, { unique: true }); db.jimeng_free_generation_results.createIndex({ "server_id": 1 }); db.jimeng_free_generation_results.createIndex({ "created_at": 1 }); +db.jimeng_free_generation_results.createIndex({ "is_read": 1 }); +db.jimeng_free_generation_results.createIndex({ "first_read_at": 1 }); db.jimeng_free_generation_results.createIndex({ "expires_at": 1 }, { expireAfterSeconds: 0 }); db.jimeng_free_generation_results.createIndex({ "server_id": 1, "created_at": 1 }); +db.jimeng_free_generation_results.createIndex({ "is_read": 1, "created_at": 1 }); print("创建服务器心跳表索引..."); db.jimeng_servers.createIndex({ "server_id": 1 }, { unique: true }); diff --git a/src/lib/database/models/GenerationResult.ts b/src/lib/database/models/GenerationResult.ts index be8e3e8..8b7ab8a 100644 --- a/src/lib/database/models/GenerationResult.ts +++ b/src/lib/database/models/GenerationResult.ts @@ -24,6 +24,11 @@ export interface IGenerationResult extends Document { // 时间管理 created_at: number; // 创建时间戳(秒) expires_at: number; // 过期时间戳(用于自动清理,默认24小时后) + + // 读取状态 + is_read: boolean; // 是否已被读取 + first_read_at?: number; // 首次读取时间戳(秒) + read_count: number; // 读取次数 } const GenerationResultSchema: Schema = new Schema({ @@ -69,10 +74,24 @@ const GenerationResultSchema: Schema = new Schema({ expires_at: { type: Number, required: true + }, + is_read: { + type: Boolean, + default: false + }, + first_read_at: { + type: Number + }, + read_count: { + type: Number, + default: 0 } }, { collection: 'jimeng_free_generation_results', timestamps: false // 使用自定义时间戳 }); +// 添加TTL索引,自动清理过期数据 +GenerationResultSchema.index({ expires_at: 1 }, { expireAfterSeconds: 0 }); + export default mongoose.model('GenerationResult', GenerationResultSchema); \ No newline at end of file diff --git a/src/lib/services/DatabaseGenerationService.ts b/src/lib/services/DatabaseGenerationService.ts index e8d851e..276c2cc 100644 --- a/src/lib/services/DatabaseGenerationService.ts +++ b/src/lib/services/DatabaseGenerationService.ts @@ -147,7 +147,7 @@ export class DatabaseGenerationService { /** * 查询任务结果 - * 从结果表查询,如果存在则返回并清理,否则查询任务状态 + * 从结果表查询,如果存在则返回结果并标记为已读取,依靠TTL自动清理过期数据 */ async queryTaskResult(taskId: string): Promise { try { @@ -155,7 +155,24 @@ export class DatabaseGenerationService { const result = await GenerationResult.findOne({ task_id: taskId }); if (result) { - // 找到结果,返回并清理 + // 找到结果,标记为已读取 + const currentTime = Math.floor(Date.now() / 1000); + const updateData: any = { + read_count: (result.read_count || 0) + 1 + }; + + // 如果是首次读取,记录首次读取时间 + if (!result.is_read) { + updateData.is_read = true; + updateData.first_read_at = currentTime; + } + + // 更新读取状态 + await GenerationResult.updateOne( + { task_id: taskId }, + { $set: updateData } + ); + const response = { created: Math.floor(Date.now() / 1000), data: { @@ -165,10 +182,7 @@ export class DatabaseGenerationService { } }; - // 删除结果记录(一次性消费) - await GenerationResult.deleteOne({ task_id: taskId }); - - logger.info(`Task result retrieved and cleaned: ${taskId}, status: ${result.status}`); + logger.info(`Task result retrieved: ${taskId}, status: ${result.status}, read_count: ${updateData.read_count}`); return response; }