如何用Node Redis OM实现Redis中discord字段匹配时更新否则创建?
问题描述
我的Schema包含一个discord字段,用于存储Discord用户ID。我需要实现这样的逻辑:如果待处理数据的discord字段在现有记录中不存在,就创建新的JSON键;如果存在,则更新匹配该discord字段的对应记录。我正在使用Node.js的Redis OM,但相关文档极少,找不到明确的操作方法。以下是我当前的代码:
export async function createStudent(data: StudentData): Promise<string> { await connect(); const repository = client.fetchRepository(schema); const student = repository.createEntity(data); const id = await repository.save(student); await client.execute(["EXPIRE", `Student:${id}`, 60]); return id; }
解决方案
Redis OM默认基于实体ID进行存储和更新,要实现基于discord字段的唯一校验与更新,需要先通过该字段查询是否存在对应记录,再决定创建或更新操作。
修改后的代码
export async function createOrUpdateStudent(data: StudentData): Promise<string> { await connect(); const repository = client.fetchRepository(schema); // 通过discord字段查询现有唯一记录 const existingStudent = await repository.search() .where("discord").equals(data.discord) .return.first(); let student; if (existingStudent) { // 存在则合并新数据到现有实体 Object.assign(existingStudent, data); student = existingStudent; } else { // 不存在则创建新实体 student = repository.createEntity(data); } // 保存实体(存在则更新,不存在则创建) const id = await repository.save(student); // 设置过期时间 await client.execute(["EXPIRE", `Student:${id}`, 60]); return id; }
关键注意事项
- 必须确保Schema中的
discord字段被标记为可索引,否则无法通过该字段查询:const schema = new Schema(Student, { discord: { type: "string", indexed: true }, // 其他字段定义... }); discord字段作为唯一标识,查询时用return.first()即可获取唯一匹配的记录(前提是业务上保证Discord用户ID的唯一性)。- 调用
repository.save()时,若传入的实体已有ID(即现有记录),Redis OM会自动执行更新操作;若为新创建的实体,则执行创建操作。
内容的提问来源于stack exchange,提问作者Patato
相关产品推荐
相关产品推荐

