개발/PrismaORM

언젠가 사용하게 될 Prisma ORM 옵션 종류 및 설명 (4)

Zaein 2023. 8. 8. 12:11

 

 

 

 

 

1. in - where에 조건을 배열로 걸기 (배열의 항목 중 하나라도 일치하는 모든 데이터 가져오기)

const users = await prisma.user.findMany({
  where: {
    id: {
      in: [1, 2, 3],
    },
  },
});

 

where에 걸고싶은 조건이 여러개일때 배열로 묶어서 In으로 전달한다.

 

userId: 1, userId: 2, userId: 3

이렇게 세명의 user를 찾고싶을때

 

findFrist를 세번 사용해 한명씩 불러오기는 매우 비효율적이다.

findMany로 모든 유저를 다 불러온 다음 그 중에서 원하는 userId만 선택하기엔

데이터가 얼마 없을땐 괜찮을지 몰라도 데이터가 다량으로 쌓였을땐 속도저하의 원인이 될 수 있다.

 

이런 상황에서

findMany에 in 옵션을 사용해 손 쉽게 원하는 데이터들을 얻을 수 있다.

 

in 옵션을 몰랐을때는 찾고싶은 데이터가 여러개일때 findFirst를 map으로 돌려야하나.... for문으로 돌려야하나... 했었는데

in 옵션을 알고난 뒤 코드의 효율이 올라갔다. 근데 주변에 물어보니 나만 모르고있었다. 참나. 나는 아직 감자가 맞다.

쿼리 공부를 더 열심히 해서 이젠 내가 1등으로 알고있어야지...

 

// 지정된 날짜보다 이전에 올라온 게시글들 찾기
const boardCreated(date: Date) {
  return this.prisma.board.findMany({
    where: { 
      createAt: { 
        lte: date,
      }
    }
  }),
};

// 찾은 게시글 정보들에서 userId만 추출 (배열)
const userIds = boardCreated.map((item) => item.userId);

// 추출한 usreId들과 일치하는 user 찾기
const usersInfo(userIds: number[]) {
  return this.prisma.user.findMany({
    where: {
      id: {
        in: userIds
      }
    }
  }),
};

더 좋은 예시가 있겠지만 대략적으로 이런 상황에서 사용할 수 있다.

 

 

 

 

2. notIn - 제외할 조건을 배열로 걸기 (배열의 항목 중 하나라도 일치하는 모든 데이터 제외 후 가져오기)

const getUser = await prisma.user.findMany({
  where: {
      name: { notIn: ['Saqui', 'Clementine', 'Bob'] },
  },
});

'Saqui'과 'Clementine', 그리고 'Bob' 이라는 이름을 가진 사용자들을 제외한 나머지 데이터만 불러온다.

 

 

 

 

 

3. Not - 제외할 조건

const users = await prisma.user.findMany({
  where: {
    NOT: {
      age: {
        lt: 18,
      },
    },
  },
});

18세 미만이 아닌 유저의 레코드를 가져온다.

 

 

 

 

 

4. Not, in - 제외할 조건을 배열로 걸기 (배열의 항목 중 하나라도 일치하는 모든 데이터 제외 후 가져오기)

const getUser = await prisma.user.findMany({
  where: {
    NOT: {
      name: { in: ['Saqui', 'Clementine', 'Bob'] },
    },
  },
});

Not 과 in 이 동시에 사용된 모습으로, 위에서 설명한 notIn 과 결과는 동일하다.