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

如何用Prisma查找玩家ID完全匹配的Conversation记录?

解决方案

要找到恰好包含指定玩家ID集合的对话,需同时满足两个核心条件:对话包含所有指定玩家,且对话的玩家数量与给定ID数组的长度完全一致。以下是实现代码:

const listOfIds = ["player-uuid-1", "player-uuid-2"]; // 你的目标玩家ID数组
const playerCount = listOfIds.length;

// 查询完全匹配的对话
const matchingConversation = await prisma.conversation.findFirst({
  where: {
    // 确保对话中所有玩家的ID都在目标列表内(无额外玩家)
    players: {
      every: {
        id: { in: listOfIds }
      }
    },
    // 确保对话的玩家数量与目标数量一致
    players: {
      count: playerCount
    }
  },
  include: { players: true } // 按需包含玩家信息
});

if (matchingConversation) {
  // 复用已有对话
  console.log("找到匹配对话,ID:", matchingConversation.id);
} else {
  // 创建新对话
  const newConversation = await prisma.conversation.create({
    data: {
      players: {
        connect: listOfIds.map(id => ({ id }))
      }
    }
  });
  console.log("创建新对话,ID:", newConversation.id);
}

关键逻辑说明

  • players.every:约束对话中的每一个玩家ID都属于目标列表,彻底排除包含额外玩家的对话。
  • players.count:确保对话的玩家数量和目标ID数组长度一致,结合every条件就能精准筛选出恰好包含所有指定玩家的对话。
  • 使用findFirst而非findMany,因为我们只需要唯一的匹配结果(如果存在)。

内容的提问来源于stack exchange,提问作者Benjamin Groves

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 06:01:04