Filtering and sorting[Prisma]

SnowCat·2023년 5월 22일
0

Prisma

목록 보기
6/10
post-thumbnail

Filtering

결합 연산자

  • NOT, OR과 같은 연산자들을 조합해 쿼리에 제약조건을 걸어 결과를 필터링 할 수 있음
const result = await prisma.user.findMany({
  where: {
    OR: [
      {
        email: {
          endsWith: 'prisma.io',
        },
      },
      { email: { endsWith: 'gmail.com' } },
    ],
    NOT: {
      email: {
        endsWith: 'hotmail.com',
      },
    },
  },
  select: {
    email: true,
  },
})

null 필터링

  • null을 사용해 값이 비어있는 데이터를 필터링 할 수 있음
const posts = await prisma.post.findMany({
  where: {
    content: null
  }
})
  • {not : null}을 사용하면 null이 아닌 게시글을 반환하게도 할 수 있음
const posts = await prisma.post.findMany({
  where: {
    content: { not: null }
  }
})

relation table을 바탕으로 하는 필터링

  • 관련 레코드의 데이터 값을 기준으로도 데이터를 필터링 할 수 있음
// user에서 posts의 개수를 바탕으로 필터링
const result = await prisma.user.findMany({
  where: {
    posts: {
      some: {
        views: {
          gt: 10,
        },
      },
    },
  },
})

// post에서 user 속성을 가지는 author기준으로 필터링
const res = await prisma.post.findMany({
  where: {
    author: {
      email: {
        contains: 'prisma.io',
      },
    },
  },
})

배열에 대한 필터링

  • has 옵션을 사용하면 배열에 특정 요소가 존재하는지 확인할 수 있음
const posts = await client.post.findMany({
  where: {
    tags: {
      has: 'databases',
    },
  },
})

대소문자를 구분하지 않는 필터링

  • PostgreSQL, MOngoDB를 사용할 때, 대소문자를 구분하면 안되는 경우 mode 옵션을 사용
const users = await prisma.user.findMany({
  where: {
    email: {
      endsWith: 'prisma.io',
      mode: 'insensitive', // 기본값: default
    },
    name: {
      equals: 'Archibald', // 대소문자 구분
    },
  },
})

Sorting

OrderBy

  • OrderBy 옵션을 사용해 쿼리 데이터를 정렬할 수 있음
const usersWithPosts = await prisma.user.findMany({
  orderBy: [
    {
      role: 'desc',
    },
    {
      name: 'desc',
    },
  ],
  include: {
    posts: { //내부 값 역시 정렬 가능
      orderBy: { 
        title: 'desc',
      },
      select: {
        title: true,
      },
    },
  },
})

relation table에서의 정렬

  • orderBy절에 내부 속성값을 적어 관계형 테이블 값을 기준으로 정렬 가능
const posts = await prisma.post.findMany({
  orderBy: {
    author: {
      email: 'asc',
    },
  },
})
  • 관계 테이블의 count 값으로 정렬할수도 있음
const getActiveUsers = await prisma.user.findMany({
  take: 10,
  orderBy: {
    posts: {
      _count: 'desc',
    },
  },
})

https://www.prisma.io/docs/concepts/components/prisma-client/filtering-and-sorting

profile
냐아아아아아아아아앙

1개의 댓글

comment-user-thumbnail
2023년 8월 21일

글 잘 읽었습니다.
위 예를 들어 user가 작성한 posts의 카운터로 필터링 할 수는 없나요?
작성한 posts개수가 10개 이상인 유저만 조회하는 기능 같은거요!

답글 달기