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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 15:22:03