본문 바로가기
개발 프레임워크/NestJS

[NestJS] 데이터 추출(페이지네이션), skip(), hasNext(), next()

by minhyeok.lee 2023. 2. 20.
반응형

NestJS 데이터 추출(페이지네이션 방식)할 때, 주의해야 할 점

 

2023.02.20 - [데이터베이스/MongoDB] - [MongoDB] 데이터 추출(페이지네이션)

 

[MongoDB] 데이터 추출(페이지네이션), skip(), hasNext(), next()

MongoDB 데이터 추출(페이지네이션 방식)할 때, 주의해야 할 점 MongoDB에서 페이지네이션 방식으로 데이터 추출할 때 2가지 방법이 있다. 1. skip()을 사용하는 방식 2. cursor.hasNext(), next()를 사용하는

kfdd6630.tistory.com

위 글 MongoDB에서 데이터 추출하는 방식

1. skip()을 사용하는 방식

2. cursor.hasNext(), next()를 사용하는 방식

 

MongoDB와 똑같은 방식으로 NestJS에서 구현한 코드

async userPagenation(): Promise<User[]> {
    let page1, page2, page3;
    try {
      page1 = await this.model.find().limit(100);
    } catch (err: unknown) {
      console.log(err);
    }
    try {
      page2 = await this.model.find().skip(100).limit(100);
    } catch (err: unknown) {
      console.log(err);
    }

    let latest = null;
    const cursor = this.model.collection.find().limit(100);
    while (await cursor.hasNext()) {
      latest = await cursor.next();
    }

    try {
      page3 = await this.model
        .find({ createdAt: { $gt: latest.createdAt } })
        .limit(100);
    } catch (err: unknown) {
      console.log(err);
    }

    return page3;
  }

 

- page1이 첫번째 100개의 items를 페이지네이션하고 있을 때, 

 

- page2

1. skip()을 사용하고 있다.

2. skip()을 하는 만큼 읽고 버린다.

3. page1과 겹치는 100개의 items를 읽고 버리고 그 다음 100개를 꺼낸다.

4. 고로 skip()안에 들어가는 매개변수가 커지면 커질 수록 사용을 지양한다.

 

- page3

1.  page1 다음의 커서를 가지고 있다가 그 다음 100개를 꺼낸다.

2. cursor.hasNext()를 사용하여 cursor가 collection.find()에서 문서를 반환하기 위해 반복할 수 있는 경우 true가 반환된다.

3. while문과 next()를 사용하여 cursor를 page1 다음으로 최신화 시켜준다.

4. page2_2는 page1 다음 데이터부터 바로 시작할 수 있다. 

 

결론: 페이지네이션 형태로 데이터를 꺼내야할 때, 되도록 page3과 같은 방식을 사용하자.

반응형

댓글