node prisma+postgreSQL中的查询与过滤

先建一个Prisma Schema,用于后面查询与过滤的数据操作

javascript 复制代码
model User {
  id        Int      @id @default(autoincrement())
  email     String   @unique
  name      String?
  createdAt DateTime @default(now())
  posts     Post[]
}

model Post {
  id        Int      @id @default(autoincrement())
  title     String
  content   String?
  published Boolean  @default(false)
  views     Int      @default(0)
  createdAt DateTime @default(now())
  authorId  Int
  author    User     @relation(fields: [authorId], references: [id])

  categories Category[]
}

model Category {
  id    Int    @id @default(autoincrement())
  name  String @unique
  posts Post[]
}

some、every、none

在进行to-many操作时,任何支持where条件的prisma方法,都可以在针对关系字段的过滤中使用它们,比如:

findeMany()、findFirst()、update/updateMany()、delete/deleteMany()

javascript 复制代码
// ① some:至少有一篇已发布的文章
const usersWithAtLeastOnePublished = await prisma.user.findMany({
  where: {
    posts: {
      some: { published: true },
    },
  },
})

// ② every:所有文章都已发布(注意:没有任何文章的用户也会被匹配)
const usersAllPublished = await prisma.user.findMany({
  where: {
    posts: {
      every: { published: true },
    },
  },
})

// ③ none:没有任何已发布的文章
const usersWithNoPublished = await prisma.user.findMany({
  where: {
    posts: {
      none: { published: true },
    },
  },
})

过滤操作符

equals、not、in、notIn、lt、lte、gt、gte、contains、startsWith、endsWith、has、hasEvery、hasSome、isEmpty

复合条件

javascript 复制代码
{
  AND: [...],   // 所有条件都满足
  OR: [...],    // 任一条件满足
  NOT: {...},   // 条件不满足
}

一段代码示例:

javascript 复制代码
// AND(隐式):多个条件同时满足
const users1 = await prisma.user.findMany({
  where: {
    name: { not: null },
    posts: {
      some: { published: true },
    },
  },
})

// 显式 AND
const users2 = await prisma.user.findMany({
  where: {
    AND: [
      { name: { contains: 'a' } },
      { posts: { some: { views: { gt: 100 } } } },
    ],
  },
})

// OR:满足任意一个条件
const users3 = await prisma.user.findMany({
  where: {
    OR: [
      { email: { endsWith: '@example.com' } },
      { posts: { some: { published: true } } },
    ],
  },
})

// NOT:取反
const users4 = await prisma.user.findMany({
  where: {
    NOT: {
      posts: {
        some: { published: false },
      },
    },
  },
})

// 混合:AND + OR + NOT + 关系过滤
const users5 = await prisma.user.findMany({
  where: {
    AND: [
      { createdAt: { gte: new Date('2025-01-01') } },
      {
        OR: [
          { posts: { some: { views: { gt: 1000 } } } },
          { posts: { every: { published: true } } },
        ],
      },
      {
        NOT: { email: { endsWith: '@spam.com' } },
      },
    ],
  },
})

排序

javascript 复制代码
orderBy: { field: 'asc' }         // 单列升序
orderBy: { field: 'desc' }        // 单列降序
orderBy: [{ f1: 'asc' }, { f2: 'desc' }]  // 多列排序

总结示例

javascript 复制代码
const users = await prisma.user.findMany({
  where: {
    AND: [
      { name: { in: ['Alice', 'Bob', 'Charlie'] } },
      { posts: { some: { published: true } } },
    ],
  },
  orderBy: [
    { createdAt: 'desc' },
    { name: 'asc' },
  ],
  include: {
    posts: {
      where: { published: true },
      orderBy: { createdAt: 'desc' },
      take: 1,
    },
  },
})
相关推荐
梦帮科技13 小时前
【3.0修订版】 RNS 代币架构:ERC20 五件套扩展与六钱包分配
数据结构·后端·算法·架构·node.js·区块链·php
niyongsheng1 天前
后端零改动,给若依换一套现代化前端
vue.js·开源·node.js
liangshanbo12151 天前
面试题:Webpack 的 publicPath 有什么作用?
前端·webpack·node.js
hasty2 天前
不上传新包,也能改变用户拿到的版本:npm dist-tag 的 OIDC 权限治理
前端·npm·node.js
福兮说2 天前
前后端算的 MD5、SHA-256 对不上?编码、换行、BOM、HMAC、JSON 顺序,八个原因逐个实测
前端·javascript·node.js·json·哈希算法
lingchen19063 天前
Node.js的下载安装配置
node.js
LRL_3 天前
【实战指南】Node.js 跨平台依赖下载:如何在 Windows/Linux 环境下互跨下载目标系统的 npm/pnpm 包
linux·windows·node.js
福兮说3 天前
URL 编码的七个坑:c++ 传到后端变空格、%25 套娃、截断 emoji 直接报错
开发语言·前端·javascript·node.js·url
liangshanbo12153 天前
Webpack vs Vite 底层原理高频追问的问题
前端·webpack·node.js
玖石书3 天前
HiSH 通过 apk 安装 Node.js、npm 与 pnpm
npm·node.js·鸿蒙·hish