Ruby

복합 키가 있는 뷰 쿼리에서 group_level 이해

뷰 쿼리는 뷰의 핵심입니다. 훌륭한 문서가 있으며 여기에서 확인할 수 있습니다: http://www.couchbase.com/docs/couchbase-manual-2.0/couchbase-views.html

복합 키

그룹 레벨이 어떻게 작동하는지 설명하기 위해 최근 로그인 타임스탬프를 기준으로 사용자를 정렬하는 맵 함수를 사용하여 해당 타임스탬프를 '복합 키'(또는 배열 키)라고 하는 배열[yyyy,MM,dd,hh,mm,ss]로 변환하여 맵 함수의 출력으로 사용해 보겠습니다:

지도 기능
function(doc, meta) {
if (doc.login_timestamp) {
emit(dateToArray(doc.login_timestamp), doc.username);
}
}
기능 축소
_count
결과 행(reduce=false 사용)
[2011,10,10,10,10,09]
"scalabl3"
[2012,12,24,17,03,59]
"scalabl3"
[2013,01,01,08,22,23]
"scalabl3"
[2013,01,25,10,38,01]
"tgrall"
[2013,01,25,11,02,32]
"jzablocki"
[2013,02,01,11,02,32]
"scalabl3"

가장 먼저 주목해야 할 중요한 점은 자바스크립트 맵 함수의 정수처럼 보이는 배열 출력이지만 그렇지 않으며, 각 인덱스 키는 문자열이고 대괄호와 쉼표를 포함하여 문자열처럼 문자별로 정렬되어 있으며, 모든 한 자리 숫자는 앞에 0이 붙어 있기 때문에 순서가 유지된다는 점입니다. 이와 비슷하므로 따옴표 문자를 그대로 유지하겠습니다:

[“2011″,”10″,”10″,”10″,”10″,”09”]
"scalabl3"
[“2012″,”12″,”24″,”17″,”03″,”59”]
"scalabl3"
[“2013″,”01″,”01″,”08″,”22″,”23”]
"scalabl3"
[“2013″,”01″,”25″,”10″,”38″,”01”]
"tgrall"
[“2013″,”01″,”25″,”11″,”02″,”32”]
"jzablocki"
[“2013″,”02″,”01″,”11″,”02″,”32”]
"scalabl3"

키 주문에 대한 간단한 설명 예시

다음과 같은 Map 출력이 있다면, 실제로 인덱스 키가 항상 문자열인 Int 매개변수일 때와 다르게 정렬되어 있음을 알 수 있습니다.

[2012,"beer",1]
null
[2012,"beer",10]
null
[2012,"beer",2]
null

문자열 비교로 인해 인덱스 키의 두 번째 '요소'는 정수가 아닌 세 번째 요소보다 앞에 오도록 정렬되어 있음을 알 수 있습니다. 예약된 프로그램으로 돌아가서...

그룹 레벨로 계속...

이제 위 뷰의 로그인_타임스탬프 목록으로 돌아가서, 연도별로 로그인한 사람 수를 확인하려면 쿼리 매개 변수 "group_level=1"을 추가하면 첫 번째 쉼표에서 문자열을 분할하고 왼쪽 요소를 문자열 일치로 그룹화한 다음 그룹에서 줄여서 개수를 산출합니다.

[“2011”]
1
[“2012”]
1
[“2013”]
4

이제 더 세분화된 보기(연도, 월)를 원한다면 그룹 수준, 그룹 수준=2에 1을 더하고 두 번째 쉼표에서 분할하여 왼쪽 요소를 가져와 그룹화한 다음 줄이기를 수행합니다. 이렇게 하면 동일한 데이터로 다음과 같은 결과가 나타납니다:

[“2011″,”10”]
1
[“2012″,”12”]
1
[“2013″,”01”]
3
[“2013″,”02”]
1

다음 그룹_레벨인 group_level=3으로 이동하면 복합 키의 세 번째 요소인 (yyyy,MM,dd)로 그룹화되며, 이는 세 번째 쉼표에서 분할되어 왼쪽 요소를 함께 그룹화하여 축소합니다:

[“2011″,”10″,”10”]
1
[“2012″,”12″,”24”]
1
[“2013″,”01″,”01”]
1
[“2013″,”01″,”25”]
2
[“2013″,”02″,”01”]
1

이 작은 데이터 집합에서 group_level=4(이 경우 시간 기준)로 이동하면 각 요소는 모두 고유하기 때문에 그룹화 및 축소할 수 있는 자체 행 결과가 됩니다(yyyy,MM,dd,hh). 더 크고 더 자주 업데이트되는 데이터 집합에서는 분 단위로 그룹화하여 더 높은 _count 수치를 볼 수 있습니다:

[“2011″,”10″,”10″,”10”]
1
[“2012″,”12″,”24″,”17”]
1
[“2013″,”01″,”01″,”08”]
1
[“2013″,”01″,”25″,”10”]
1
[“2013″,”01″,”25″,”11”]
1
[“2013″,”02″,”01″,”11”]
1

복합 키 이해

보시다시피 복합 키는 매우 유용하지만 어느 정도 이해가 있어야 올바르게 사용할 수 있습니다. 문자열 비교라는 점을 기억하면 예상한 대로 정렬되지 않는 키를 만들지 않는 데 도움이 됩니다. 또한 정수 '값'이 아닌 문자열 비교이므로 올바른 순서를 유지하기 위해 패드 번호에 0을 남겨두는 것이 좋습니다:

함수 (문서, 메타) {
if (doc.year && doc.type == "beer" && doc.int_value) {
var val = doc.int_value.toString();
var max ="000000000″;
var pval = max.substring(0, max.length - val.length) + val;
emit([doc.year, doc.type, pval], null);
}
}
결과 행(reduce=false 사용)
[2012,”beer”,”000000001″]
1
[2012,”beer”,”000000002″]
1
[2012,”beer”,”000000010″]
1

물론 배열에는 날짜ToArray뿐만 아니라 무엇이든 넣을 수 있습니다! 이는 항목을 그룹화하여 줄일 수 있는 유용한 전략입니다. 마지막으로 기억해야 할 것은 0으로 패딩하면 문자열이므로 결과 인덱스 키에 대해 범위 쿼리를 수행하려는 경우, 예를 들어 특정 범위를 찾고 있다면 해당 범위도 0으로 패딩해야 한다는 것입니다:

startkey=[2012,”beer”,”000000002″]
&endkey=[2012,”beer”,”000000007″]

유니코드 콜레이션 이해

문자열 문자 순서에 대한 자세한 내용은 뷰의 유니코드 정렬에 대한 게시물을 참조하세요. 이 순서는 바이트 순서가 아니며 복합 키에도 적용됩니다: 뷰 쿼리에서 문자 순서 지정 이해

scalabl3

이 문서 공유하기
받은 편지함에서 카우치베이스 블로그 업데이트 받기
이 필드는 필수 입력 사항입니다.

작성자

게시자 카우치베이스 팀

의 선임 웹 관리자입니다. 웹 사이트 관리자로서 디자인, 구현, 콘텐츠 및 성능을 포함한 웹 사이트 자산에 대한 전반적인 책임을 맡고 있습니다.

댓글 하나

  1. 알리레자 알리도스트 6월 4, 2015에서 6:39 오후

    그룹 적용 및 축소가 적용되지 않으면 어떻게 되나요? 그룹 수준에서 DISTINCT 키가 제공되나요?

  2. [...] 질문: 복합 키를 사용할 수 있는 유일한 방법은 보기인가요? 보기 없이도 이러한 종류의 기능을 사용하기 위해 get 또는 setup 키와 함께 사용할 수 있는 방법이 있나요? http://www.couchbase.com/understanding-grouplevel-view-queries-compound-keys  […]

댓글 남기기

카우치베이스 카펠라를 시작할 준비가 되셨나요?

구축 시작

개발자 포털에서 NoSQL을 살펴보고, 리소스를 찾아보고, 튜토리얼을 시작하세요.

카펠라 무료 사용

클릭 몇 번으로 Couchbase를 직접 체험해 보세요. Capella DBaaS는 가장 쉽고 빠르게 시작할 수 있는 방법입니다.

연락하기

카우치베이스 제품에 대해 자세히 알고 싶으신가요? 저희가 도와드리겠습니다.