[이 블로그는 https://blog.grallandco.com]에서 신디케이트되었습니다.
Couchbase 클러스터에 대해 쿼리를 수행할 때 많은 수의 문서를 처리해야 하는 경우 페이지 매김을 사용하여 페이지별로 행을 가져오는 것이 중요합니다. 문서에서 "페이지 매김'라는 질문이 있지만, 이 글에서 더 자세한 내용과 샘플 코드를 살펴보고자 합니다.
이 페이지 매김 예제에서는 다음과 같은 간단한 보기를 만드는 것으로 시작하겠습니다. 맥주 샘플 데이터 집합을 사용하여 국가별 양조장을 찾는 데 뷰를 사용합니다:
if (doc.type == "brewery" && doc.country){
emit(doc.country);
}
}
이 보기에는 국가별로 모든 양조장이 나열되며 색인은 다음과 같습니다:
| 문서 ID | 키 | 가치 |
|---|---|---|
| bersaglier | 아르헨티나 | null |
| cervecera_jerome | 아르헨티나 | null |
| 브로우리_나시오날_발라시 | 아루바 | null |
| 호주_브루잉_법인 | 호주 | null |
| 칼튼 앤 유나이티드 브루어리 | 호주 | null |
| 쿠퍼스_브루어리 | 호주 | null |
| foster_s_australia_ltd | 호주 | null |
| 골드코스트_브루어리 | 호주 | null |
| 라이온_나단_호주_헌터_거리 | 호주 | null |
| little_creatures_brewery | 호주 | null |
| 몰트_삽_양조장 | 호주 | null |
| 마틸다_베이_브루잉 | 호주 | null |
| … | … | … |
| … | … | … |
| … | … | … |
| 옐로우스톤_밸리_브루잉 | 미국 | null |
| 유잉링_손_브루잉 | 미국 | null |
| 제아_로티세리_앤_브루어리 | 미국 | null |
| fosters_tien_gang | 베트남 | null |
| hue_brewery | 베트남 | null |
이제 페이지 크기가 5행인 이 색인에서 탐색하려고 합니다.
건너뛰기/제한 매개변수 사용
가장 간단한 접근 방식은 limit 그리고 건너뛰기 매개변수를 예로 들 수 있습니다:
1 페이지 : ?limit=5&skip0
2페이지: .limit=5&skip=5
…
페이지 x: ?limit=5&skip(limit*(page-1))
범위 또는 키 쿼리를 수행하는 데 필요한 다른 매개 변수를 사용할 수 있습니다(시작키/종료키, 키, 키) 및 정렬 옵션(내림차순).
이 방법은 간단하지만 쿼리 엔진이 건너뛰기 값에 도달할 때까지 쿼리와 일치하는 모든 행을 읽어야 하므로 가장 효율적인 방법은 아닙니다.
이 보기를 사용하여 페이지 매김하는 파이썬의 일부 코드 샘플 :
이 애플리케이션은 색인이 끝날 때까지 모든 페이지를 반복합니다.
앞서 말했듯이 이것은 건너뛰기에 도달할 때까지 시스템이 모든 값을 읽어야 하므로 페이지 매김 모범 사례를 나타내지 않습니다. 다음 예제는 이 문제를 처리하는 더 나은 방법을 보여줍니다.
startkey / startkey_docid 매개변수 사용
- 그리고 시작키 매개변수는 쿼리가 읽기를 시작해야 하는 키의 값입니다("이전 페이지"의 마지막 키 기준).
- 예를 들어 "독일"과 같은 키의 경우 하나 이상의 ID(문서)가 있을 수 있으므로 Couchbase 쿼리 엔진에 시작할 위치를 알려야 하므로 이를 위해 다음을 사용해야 합니다. startkey_docid 매개변수를 설정하고, 이 ID는 이전 페이지의 마지막 항목이므로 무시합니다.
| 행 번호 | 문서 ID | 키 | 가치 |
|---|---|---|---|
| 1 페이지에 대한 쿼리 : ?limit=5 | |||
| 1 | bersaglier | 아르헨티나 | null |
| 2 | cervecera_jerome | 아르헨티나 | null |
| 3 | 브로우리_나시오날_발라시 | 아루바 | null |
| 4 | 호주_브루잉_법인 | 호주 | null |
| 5 | 칼튼 앤 유나이티드 브루어리 | 호주 | null |
| 2페이지에 대한 쿼리: ?limit=5&startkey="Australia"&startkey_docid=carlton_and_united_breweries&skip=1 | |||
| 6 | 쿠퍼스_브루어리 | 호주 | null |
| 7 | foster_s_australia_ltd | 호주 | null |
| 8 | 골드코스트_브루어리 | 호주 | null |
| 9 | 라이온_나단_호주_헌터_거리 | 호주 | null |
| 10 | little_creatures_brewery | 호주 | null |
| 3 페이지에 대한 쿼리 : limit=5&startkey="Australia"&startkey_docid=little_creatures_brewery&skip=1 | |||
| 11 | 몰트_삽_양조장 | 호주 | null |
| 12 | 마틸다_베이_브루잉 | 호주 | null |
| … | … | … | … |
| … | … | … | … |
| … | … | … | … |
| … | 옐로우스톤_밸리_브루잉 | 미국 | null |
| … | 유잉링_손_브루잉 | 미국 | null |
| … | 제아_로티세리_앤_브루어리 | 미국 | null |
| … | fosters_tien_gang | 베트남 | null |
| … | hue_brewery | 베트남 | null |
따라서 위의 예제에서 볼 수 있듯이 쿼리는 시작 키, 문서 ID를 사용하고 skip=1을 사용하여 전달합니다.
이제 다시 한 번 Python으로 애플리케이션 코드를 살펴보겠습니다.
축소 기능이 있는 뷰
카우치베이스 자바 SDK 페이지네이터
이전 예제에서는 다양한 쿼리 매개변수를 사용하여 페이지 매김을 수행하는 방법을 보여드렸습니다. Java SDK는 개발자가 페이지 매김을 처리하는 데 도움이 되는 페이지 매김 객체를 제공합니다. 다음 예제에서는 페이지 매기기 API를 사용하여 동일한 보기를 사용합니다.
보시다시피 Java 페이지 매기기를 사용하여 쿼리 결과를 쉽게 페이지 매길 수 있습니다.
- #37 줄에서 뷰 및 쿼리 개체를 사용하여 페이지 매김이 생성되고 페이지 크기가 지정됩니다.
- 그런 다음 hasNext() 및 next() 메서드를 사용하여 결과를 탐색하기만 하면 됩니다.
Java 페이지네이터는 쿼리가 reduce를 사용하고 있는지 여부를 인식하므로 모든 유형의 쿼리에 사용할 수 있으며, 내부적으로 건너뛰기/제한 접근 방식과 doc_id 접근 방식 간에 전환합니다. 다음을 수행할 수 있습니다. 페이지 매기기 클래스에서 어떻게 수행되는지 확인하세요..
HTTP 요청 사이에 웹 애플리케이션에서 이 작업을 수행하려면 현재 API가 현재 페이지를 해당 상태로 유지하므로 사용자 세션에서 페이지 매기기 객체를 유지해야 합니다.
결론
이 블로그 게시물에서는 Couchbase 보기에서 페이지 매김을 처리하는 방법을 배웠습니다. 요약하면 다음과 같습니다.
- 페이지 매김은 쿼리를 실행할 때 전송하는 몇 가지 특정 매개변수를 기반으로 합니다.
- Java 개발자는 페이지 매김을 간소화하는 Paginator 클래스를 사용할 수 있습니다.
튜토리얼에서
연령이 30세 이상인 경우
제한 2
오프셋 2
N1QL에 대해 자세히 알아보려면 다음을 참조하세요:
유용한 정보가 많네요!
페이지에 대해 (그리고 문서에서 언급된) 한 가지 알아차린 점은 X 페이지를 검색하는 데 걸리는 시간이 0에서 X까지의 거리에 비례한다는 것입니다. 예를 들어 100,000개의 행이 있고 페이지가 각각 1,000개(100페이지)인 경우 100페이지를 검색하면 100,000개 전체를 검색하는 것과 같은 시간이 걸립니다. 작업의 단순성을 위해 비교적 정교한 해결 방법이 언급되어 있는데, 이는 기본적으로 보기 페이지 로직에 베이크인할 수 있는 기능일까요?
뷰 쿼리 키(=startKey)가 서로 고유하다면 startkey_docid를 사용할 필요가 없다고 생각합니다. 제 말이 맞나요?
그리고 더... startkey_docid는 뷰 쿼리 키와 독립적이므로 정렬된 뷰 쿼리 인덱스에서 start_key_docid로 시작점을 찾는 데 약간의 비용이 소요될 수 있습니다 - 시작점부터 docid를 만날 때까지 스캔해야 합니다.
안녕하세요, 페이지 매김 기능이 있는 총페이지를 얻으려면 어떻게 해야 하나요?