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

如何在Prisma中指定字段并直接获取值的扁平数组而非对象数组

解决Prisma查询中直接获取扁平userId数组的问题

嘿,作为Prisma新手,你的思路完全正确——Prisma确实能帮你优化这个流程,虽然没办法直接在查询语句中返回纯number数组(因为Prisma是基于关系模型返回结构化对象),但我们可以优化查询逻辑,让后续的数据处理更简洁,甚至接近“一步到位”的效果。

第一步:优化查询,只获取需要的字段

首先,你可以在查询时通过select指定只返回userIds中的userId字段,避免获取多余的issueId数据,这样返回的结构会更精简:

const project = await prisma.project.findFirst({
  where: { id: req.currentUser.projectId },
  include: { 
    users: true, 
    issues: { 
      // 这里要记得保留你需要的issue其他字段,比如id、title等,不然只会返回userIds
      select: {
        id: true,
        title: true, // 示例字段,根据你的实际需求调整
        userIds: { select: { userId: true } }
      }
    } 
  },
})

这样返回的issue.userIds会是[{ userId: 1 }],比原来的结构更干净,后续处理也更简单。

第二步:更简洁的数据转换

基于优化后的查询结果,你可以用更简洁的方式把对象数组转成扁平number数组,比如用map结合解构:

const formattedProject = {
  ...project,
  issues: project.issues.map(issue => ({
    ...issue,
    userIds: issue.userIds.map(({ userId }) => userId)
  }))
}

这个写法比你原来的代码更简洁,而且因为查询时已经过滤了多余字段,性能也会更好一点。

有没有办法完全在查询中实现?

目前Prisma Client还不支持直接返回扁平的primitive数组(比如纯[1,2,3]),因为它的查询设计是围绕关系型数据的对象结构展开的。如果一定要完全在数据库层面处理,你可以考虑用原生SQL查询,比如:

const result = await prisma.$queryRaw`
  SELECT p.*, ARRAY(SELECT userId FROM IssueUser WHERE issueId = i.id) as userIds
  FROM Project p
  JOIN Issue i ON p.id = i.projectId
  WHERE p.id = ${req.currentUser.projectId}
`

不过这种方式需要你熟悉数据库的原生语法,而且返回的结果是纯JSON对象,没有Prisma的类型支持,对于新手来说可能没必要。

总结

对于新手来说,最推荐的还是“优化查询+简洁转换”的组合,既利用了Prisma的类型安全和便捷查询,又能得到你想要的扁平数组格式,代码也足够清晰。

内容的提问来源于stack exchange,提问作者Brady Edgar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 15:02:38