如何在Prisma中对JSON类型列的指定字段执行distinct操作
在Prisma中对JSON列指定字段执行distinct去重操作
因为Prisma Client原生的distinct选项仅支持模型的顶层字段,无法直接对JSON嵌套字段做去重,下面提供两种可行的解决方法:
方法一:原生SQL查询(推荐,性能更优)
直接通过$queryRaw执行原生SQL,根据你使用的数据库调整JSON字段提取语法:
PostgreSQL 示例
PostgreSQL用->>操作符提取JSON字段的文本值,再做去重:
import { PrismaClient } from '@prisma/client'; const prisma = new PrismaClient(); async function getDistinctCodes() { const distinctCodes = await prisma.$queryRaw` SELECT DISTINCT data->>'code' AS code FROM your_table_name WHERE data->>'code' IS NOT NULL; `; return distinctCodes; }
MySQL 示例
MySQL可使用JSON_UNQUOTE(JSON_EXTRACT())或简化的->>操作符(需MySQL 5.7及以上版本):
async function getDistinctCodes() { const distinctCodes = await prisma.$queryRaw` SELECT DISTINCT data->>'$.code' AS code FROM your_table_name WHERE data->>'$.code' IS NOT NULL; `; return distinctCodes; }
方法二:应用层去重(仅适合小数据量场景)
如果数据量不大,可以先拉取所有包含目标字段的记录,再在应用内存中去重:
async function getDistinctCodes() { const records = await prisma.yourModel.findMany({ select: { data: true }, where: { data: { path: ['code'], not: null, }, }, }); // 用Set去重并过滤空值 const distinctCodes = [...new Set(records.map(item => item.data?.code).filter(Boolean))]; return distinctCodes; }
注意:该方法会将符合条件的数据全部加载到内存,数据量大时会显著影响性能,不推荐用于大数据集。
内容的提问来源于stack exchange,提问作者MML1357
相关产品推荐
相关产品推荐

