반응형
NestJS 데이터 추출(페이지네이션 방식)할 때, 주의해야 할 점
2023.02.20 - [데이터베이스/MongoDB] - [MongoDB] 데이터 추출(페이지네이션)
위 글 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과 같은 방식을 사용하자.
반응형
'개발 프레임워크 > NestJS' 카테고리의 다른 글
[NestJS] 매핑유형(Partial, Pick, Omit, Intersection) Type() (0) | 2023.02.23 |
---|---|
[NestJS] MongoDB 컬렉션에 문서(객체)를 삽입하기 (0) | 2023.02.21 |
[NestJS] 개발환경 구성 (0) | 2023.02.20 |
[NestJS] Swagger 문서 모듈 별로 분리 (0) | 2023.02.14 |
[NestJS] 타입 종류_Swagger (0) | 2023.02.10 |
댓글