You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 04:20:29