Couchbase 4.0에서 N1QL은 개발자가 내부에 저장된 NoSQL 데이터를 쿼리할 때 더 많은 유연성을 제공하기 위한 방법으로 도입되었습니다. 카우치베이스 서버. JSON 데이터에 대해 SQL 쿼리를 실행할 수 있고 모든 것이 놀랍습니다. 하지만 N1QL이 이만큼 훌륭하다 해도 아쉬운 기능이 있었습니다. Couchbase 5.0으로 넘어오면서 이러한 기능 중 상당수가 이제 현실이 되었습니다. 예를 들어 N1QL 쿼리 내에서 하위 쿼리를 사용할 수 있는 기능을 생각해 보세요. 이 기능은 이미 존재했지만, Couchbase Server 5.0에서는 일반 표현식에 하위 쿼리를 사용할 수 있는 하위 쿼리 표현식을 제공합니다.
이 글을 작성하는 시점인 2017년 1월 현재 Couchbase 5.0은 개발자 빌드를 통해 사용할 수 있습니다. 새로운 기능이 추가될 예정이지만 아직 프로덕션에 사용할 수 있는 빌드는 아닙니다. 개발자 빌드에 대한 자세한 내용은 다음에서 확인할 수 있습니다. 블로그 공지사항 주제에 대해 설명합니다.
중첩된 문서에 대한 하위 쿼리가 무엇을 의미하는지 살펴보겠습니다. 이 예제에서는 다음 두 문서를 기준으로 작업하겠습니다:
아래 문서의 문서 키는 주문::1 영수증 역할을 합니다:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
{ "type": "주문", "customerId": "nraboy", "주문 번호": "12345", "제품": [ { "productId": "포켓몬-레드", "수량": 1, "가격": 39.99 }, { "productId": "포켓몬-노랑", "수량": 1, "가격": 39.99 } ] } |
아래 문서의 문서 키는 주문::2 다른 사람의 영수증 역할을 합니다:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
{ "type": "주문", "customerId": "mgroves", "주문 번호": "34532", "제품": [ { "productId": "포켓몬-블루", "수량": "1", "가격": 39.99 }, { "productId": "젤다-오카리나 시간", "수량": 2, "가격": 59.99 } ] } |
이 예제에서 주목해야 할 중요한 점은 배열 안에 객체가 중첩되어 있어 문서가 복잡해졌다는 사실입니다. 우리가 추구하는 것은 바로 복잡성입니다.
이제 각 사용자가 비디오 게임에 지출한 총액을 가져오고 싶다고 가정해 보겠습니다. 일반적으로 이 작업은 집계 함수가 있는 하위 쿼리를 사용하여 수행됩니다. 카우치베이스 서버 5.0에서는 다음과 같은 작업이 가능합니다:
1 2 3 4 |
선택 customerId, (선택 RAW SUM(제품.가격 * 제품.수량) FROM 기본값.제품 AS 제품)[0] AS 합계 FROM 기본값; |
물론 하위 쿼리는 집계에만 국한되지 않습니다. 중첩된 데이터에 사용할 수 있습니다. 존재
조건, MERGE
또는 다른 어떤 것이든 가능합니다. 다음과 같은 경우를 파악하고 싶다고 가정해 보겠습니다. 포켓몬-파랑 는 모든 영수증에 존재합니다. 해당 데이터를 쿼리하기 위해 다음과 같은 작업을 수행할 수 있습니다:
1 2 3 4 |
선택 customerId, 주문 번호 FROM 기본값 어디 "포켓몬-블루" IN (선택 RAW 제품.productId FROM 기본값.제품 AS 제품); |
그러나 하위 쿼리를 사용할 수 있다고 해서 모든 시나리오에서 반드시 사용해야 하는 것은 아니며 더 나은 성능을 얻을 수 있는 다른 방법도 있습니다. 위의 예에서 하위 쿼리를 사용하는 대신 다음과 같은 방법을 사용해 보세요:
1 2 3 4 |
선택 customerId, 주문 번호 FROM 기본값 어디 일부 제품 IN 기본값.제품 만족 제품.productId = "포켓몬-블루" END; |
두 쿼리 모두 동일한 작업을 수행하지만 한 쿼리가 다른 쿼리보다 더 나은 성능을 제공합니다. 결과적으로 필요한 것이 무엇인지 파악한 다음 그에 맞는 쿼리를 정의하면 됩니다.
하위 쿼리 표현식을 사용할 수 있는 또 다른 예를 살펴보겠습니다. 하위 쿼리 표현식을 LET
절을 다음과 같이 추가합니다:
1 2 3 4 5 |
선택 customerId, SUM(합계) FROM 기본값 LET 합계 = (선택 RAW SUM(제품.가격 * 제품.수량) FROM 기본값.제품)[0] 그룹 BY customerId; |
고객에 대한 문서가 두 개 이상 있다고 가정하면 총합이 합산되어 특정 고객의 총 구매 내역을 볼 수 있습니다. 우리는 LET
대 허용
값을 그룹화하고 집계하기 전에 값을 결정해야 하기 때문입니다.
하위 쿼리 표현식이 의미가 있을 수 있는 다른 시나리오는 다음과 같습니다. MERGE
그리고 허용
조항.
Couchbase에서 N1QL을 사용하는 방법에 대한 자세한 내용은 다음을 참조하세요. 카우치베이스 개발자 포털.