N1QL 쿼리 언어에는 JSON 배열 작업을 위한 다양한 기능이 있습니다. 이 문서에서는 배열 상수, 배열에서 검색하는 기능, 배열을 변환하는 방법, 몇 가지 유용한 N1QL 배열 함수에 대해 다룹니다. 대화형 형식이므로 Couchbase 인스턴스를 실행하고 예제를 직접 사용해 보세요.
먼저 Couchbase 인스턴스의 관리자 콘솔로 이동하여 "test"라는 이름의 버킷을 만듭니다.
또는 다음과 같이 명령줄에서 버킷을 만들 수도 있습니다:
curl -X POST -u 관리자:비밀번호 -d 이름=테스트 -d 램쿼터MB=100 -d 인증 유형=sasl -d saslPassword=donotuse -d 프록시 포트=11224 -d 버킷 유형=couchbase http://localhost:8091/pools/default/buckets
다음과 같이 CBQ 셸을 사용하여 인스턴스에 연결합니다:
cbq -e http://localhost:8091 -u 관리자 -p 비밀번호
그런 다음 CBQ에서 새 버킷에 기본 인덱스를 만듭니다:
cbq> 테스트에서 기본 인덱스를 만듭니다;
이제 시작할 준비가 되었습니다.
카우치베이스 배열 상수
우선, N1QL을 사용하면 다음과 같이 배열 값을 배열 상수로 직접 생성할 수 있습니다:
cbq> select [1,2,3] as num_array, ["a", "b", "c"] as string_array, ["1", 2, [3, "4"], {"a":"b"}] as mixed_array;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
"결과": [ { "mixed_array": [ "1", 2, [ 3, "4" ], { "a": "b" } ], "num_array": [ 1, 2, 3 ], "문자열 배열": [ "a", "b", "c" ] } ] |
상수에는 데이터베이스에서 가져온 값도 포함될 수 있습니다:
cbq> insert into test (key, value) values ("ex1", {"v1" : 7, "v2" : "bird", "v3" : 99});
cbq> select [1, v1, 3] as num_array, ["a", v2, "c"] as string_array from test where v3 = 99;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
"결과": [ { "num_array": [ 1, 7, 3 ], "문자열 배열": [ "a", "새", "c" ] } ] |
제로 기반 인덱스를 통한 요소 선택도 지원됩니다:
cbq> select ["apple", "banana", "cherry", "date", "elderberry"][1] as val;
1 2 3 4 5 |
"결과": [ { "val": "바나나" } ] |
카우치베이스 쿼리 배열 및 배열 내 검색
IN 절은 멤버십을 테스트하는 데 사용됩니다.
cbq> select (9 IN [1, 2, 3, 4]) as not_found, (9 IN [7, 8, 9]) as is_found;
1 2 3 4 5 6 |
"결과": [ { "is_found": true, "not_found": false } ] |
ANY 절은 배열의 요소 중 하나 이상이 특정 조건과 일치하는지 확인하는 데 사용됩니다:
cbq> select (ANY v IN [1, 2, 3, 4, 5] SATISFIES v > 4 END)를 is_found로, (ANY v IN [1, 2, 3, 4, 5] SATISFIES v = 7 END)를 not_found로 입력합니다;
1 2 3 4 5 6 |
"결과": [ { "is_found": true, "not_found": false } ] |
EVERY 절은 배열의 모든 요소가 특정 조건과 일치하는지 확인하는 데 사용됩니다:
cbq> select (EVERY v IN [1, 2, 3, 4, 5] SATISFIES v > 0 END) as is_found, (EVERY v in [-1, 0, 1, 2, 3] SATISFIES v > 0 END )를 not_found로 입력합니다;
1 2 3 4 5 6 |
"결과": [ { "is_found": true, "not_found": false } ] |
ANY AND EVERY는 EVERY와 매우 유사하지만 빈 배열에 대해서는 EVERY가 참이지만 ANY AND EVERY는 거짓입니다:
cbq> select (ANY AND EVERY v IN [] SATISFIES v > 0 END)를 any_very_res로, (EVERY v IN [] SATISFIES v > 0 END)를 every_res로 합니다;
1 2 3 4 5 6 |
"결과": [ { "any_every_res": false, "every_res": true } ] |
슬라이싱
[:] 연산자는 슬라이싱, 즉 배열 조각을 가져오는 데 사용됩니다.
cbq> [1, 2, 3, 4, 5][1: 3]을 res로 선택합니다;
1 2 3 4 5 6 7 8 |
"결과": [ { "res": [ 2, 3 ] } ] |
슬라이스 표현식의 첫 번째 값은 시작할 인덱스(0 기준)이고, 두 번째 값은 제외해야 할 첫 번째 인덱스입니다. 이 규칙은 다른 프로그래밍 언어에서도 익숙할 것입니다.
슬라이스의 시작과 끝을 모두 지정해야 합니다. 음수 값은 배열의 끝부터 열거됩니다:
cbq> [1, 2, 3, 4, 5][1: -1]을 res로 선택합니다;
1 2 3 4 5 6 7 8 9 |
"결과": [ { "res": [ 2, 3, 4 ] } ] |
카우치베이스 배열 변환하기
ARRAY 표현식을 사용하면 배열을 다른 배열로 변환할 수 있습니다.
cbq> ARRAY v*2 FOR v IN [1, 2, 3, 4, 5] END를 res로 선택합니다;
1 2 3 4 5 6 7 8 9 10 11 |
"결과": [ { "res": [ 2, 4, 6, 8, 10 ] } ] |
ARRAY 표현식은 선택도 지원합니다:
cbq> ARRAY v*2 FOR v IN [1, 2, 3, 4, 5] WHEN v > 2 END를 res로 선택합니다;
1 2 3 4 5 6 7 8 9 |
"결과": [ { "res": [ 6, 8, 10 ] } ] |
대상 표현식에는 각 값뿐만 아니라 인덱스도 포함될 수 있습니다:
cbq> SELECT ARRAY {v:pos} FOR pos:v IN [ "one", "two", "three" ] END;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
"결과": [ { "$1": [ { "one": 0 }, { "two": 1 }, { "3": 2 } ] } ] |
N1QL의 배열 연산에 대해 자세히 알아보려면 다음 문서를 확인하세요. 여기.
카우치베이스 배열 함수
N1QL에는 JSON 배열에서 작동하기 위한 광범위한 함수 집합이 있습니다.
ARRAY_LENGTH는 배열의 길이를 반환합니다.
cbq> select ARRAY_LENGTH([1, 2, 3, 4, 5]) as res;
1 2 3 4 5 |
"결과": [ { "res": 5 } ] |
ARRAY_APPEND는 배열의 끝에 요소를 추가합니다.
cbq> select ARRAY_APPEND([1, 2, 3, 4, 5], 9, 10) as res;
1 2 3 4 5 6 7 8 9 10 11 12 13 |
"결과": [ { "res": [ 1, 2, 3, 4, 5, 9, 10 ] } ] |
ARRAY_CONCAT도 비슷하지만 두 배열을 함께 결합합니다.
cbq> select ARRAY_CONCAT([1, 2, 3, 4, 5], [7, 8]) as res;
1 2 3 4 5 6 7 8 9 10 11 12 13 |
"결과": [ { "res": [ 1, 2, 3, 4, 5, 7, 8 ] } ] |
ARRAY_SORT는 배열의 요소를 정렬합니다.
cbq> select ARRAY_SORT([2, 1, 3, 5, 4]) as res;
1 2 3 4 5 6 7 8 9 10 11 |
"결과": [ { "res": [ 1, 2, 3, 4, 5 ] } ] |
마지막으로 ARRAY_DISTINCT는 배열에서 중복을 제거합니다.
cbq> select ARRAY_DISTINCT([1, 2, 3, 3, 3, 4, 5, 4, 5]) as res;
1 2 3 4 5 6 7 8 9 10 11 |
"결과": [ { "res": [ 5, 1, 4, 2, 3 ] } ] |
N1QL에는 여기서 다루기에는 너무 많은 유용한 배열 함수가 있습니다. 전체 목록은 다음과 같습니다. 여기.
성능
"하지만 JSON 배열의 성능은 어떨까요?"라고 질문하실 수 있습니다. 걱정하지 마세요. 다른 글에서 다루겠습니다, 여기.