글
웹 개발에서 게시판을 만들면 일반적으로 Pagination도 구현해 문서를 일정 단위 개수로 페이지를 보여줘야 한다.
전체 글 수를 간단하게 10개씩 보여주는 건 간단하게 가능하다. 하지만 전체 글이 90개라면 페이지는 1 ~ 10이 아닌
1 ~ 9까지만 보여줘야 한다. 이러한 작업을 위해서는 데이터베이스의 10개 단위 글만 가져오는 것이 아니라 전체 글 수도 가져와야
페이지 끝을 정해 줄 수 있다. 보통은 리스트를 가져오는 쿼리와 전체 글 수를 가져오는 쿼리를 각각 돌려 작업한다.
이러한 방법이 아닌 한번에 가능한 방법을 찾다가 Aggregation 파이프라인 명령어 중 하나인 $facet를 알게 되었다.
https://docs.mongodb.com/manual/reference/operator/aggregation/facet/
간단하게 설명하면 $facet는 하나의 스테이지 안에서 여러 개의 파이프라인을 돌릴 수 있도록 해주는 파이프라인이다.
{ $facet: { <outputField1>: [ <stage1>, <stage2>, ... ], <outputField2>: [ <stage1>, <stage2>, ... ], ... } }
작성법은 다음과 같다.
하나의 결과값을 나타내는 outputField는 반드시 대괄호로 묶어야 하며 중괄호나 소괄호 사용 시 오류가 발생한다.
이 파이프라인을 이용해서 전체 글 수와 글 10개를 가져올 수 있다.
{ $facet: { 'documents': [ {$skip: 10}, {$limit: 10} ], 'total': [ { $count: 'count' } ] } }
documents 필드는 전체 글 중 11번째 글부터 20번째 글을 가져온다.
total 필드는 전체 글 수를 가지는 count 필드를 가진다.
Compass를 통해 Aggregation을 실행하면 결과값은 다음과 같다.
document 필드 내 각 object는 하나의 글 데이터이다.
이렇게 두번의 쿼리를 사용하지 않고 한번에 전체 글 수와 일정 개수의 문서를 가져올 수 있다.
단순히 게시판 뿐만 아니라 여러 결과 값을 하나의 데이터로 만들고 싶을 때 $facet를 사용하면 된다.
'MongoDB' 카테고리의 다른 글
사용자 정의 날짜/시간 포맷을 ISOdate로 변환 (0) | 2018.08.19 |
---|
RECENT COMMENT