*바 덤 츠흐* ...내가 뭘 했는지 봤지? 알겠어? 알겠어? 하하.
그래서... N1QL(니켈로 발음)... Couchbase의 새로운 차세대 쿼리 언어가 무엇일까요? 글쎄요, 그것은 Couchbase 내에서 임시 및 운영 쿼리를 위해 설계된 다소 천재적으로 설계된, 사람이 읽고 쓸 수 있으며 확장 가능한 언어입니다. 이미 Couchbase 내에서 쿼리에 익숙하신 분이라면 이 문구가 이해가 되실 것입니다. 그렇지 않다면 아마도 그렇지 않을 테니 조금 더 자세히 설명해 드리겠습니다.
하지만 그 전에 이 블로그 글이 N1QL에 대해 자세히 알아보고 싶으신 분들께는 적합하지 않다는 점을 알려드리고 싶습니다. 이 글은 개발자의 관점에서 N1QL을 바라보는 관점이며, 제가 왜 N1QL에 열광하는지, 그리고 제가 자랑스럽게 지적하는 기능에 대해 설명합니다. N1QL에 대한 학습을 시작하고 싶으시다면 이 글을 참조하세요, 여기를 클릭하세요. 또는 다른 방법으로는 온라인 튜토리얼. 어쨌든, 다시 N1QL이라는 말의 의미를 정리해 보겠습니다...
"N1QL은 관계형 데이터베이스용 표준 SQL 언어와 유사하지만 문서 중심 데이터베이스에 적합한 추가 기능도 포함하고 있습니다." N1QL은 테이블이 아닌 문서 중심으로 구성된 데이터베이스에서 사용하기 위한 직관적인 쿼리 언어로 설계되었습니다. 문서 중심 데이터베이스에서 정보를 찾고 활용하려면 문서와 문서 구조를 탐색하기 위한 올바른 로직과 표현식이 필요합니다. N1QL은 문서 데이터베이스에서 정보를 쿼리하고 검색할 수 있는 명확하고 이해하기 쉬운 추상화 계층을 제공합니다.
N1QL로 넘어가기 전에 Couchbase 내의 문서 모델링에 대해 간단히 살펴보겠습니다. 아시다시피, Couchbase에서는 주로 JSON으로 문서를 모델링합니다. 우리 모두 JSON에 익숙하기 때문에 자세히 설명하지는 않겠지만, 한 가지 명심해야 할 것은 JSON 문서에는 복잡한 중첩 데이터 구조, 중첩 배열 및 객체가 있을 수 있다는 사실이며, 이는 일반적으로 쿼리에 문제를 일으킬 수 있습니다. 하지만 SQL과 달리 N1QL은 다음과 같은 개념을 지원하기 때문에 중첩된 데이터를 탐색할 수 있습니다. 경로. 이것은 매우 멋지다. 다음을 사용할 수 있습니다. 경로 점 표기 구문을 사용하여 문서 내에서 속성의 논리적 위치를 파악할 수 있습니다. 예를 들어, 고객의 주문이 포함된 문서가 있는 이커머스 사이트가 있다면 해당 문서 내부에서 속성을 N번째 중첩된 수준까지 살펴볼 수 있습니다. 예를 들어 고객의 배송지를 찾고 싶다고 가정해 보겠습니다:
아주 멋지지 않나요? 이것은 또한 이 쿼리 언어가 SQL과 차별화되는 큰 차별화 요소 중 하나입니다.
이 글을 읽고 계신 대부분의 분들처럼 저도 SQL 출신입니다. 99% 여러분도 마찬가지라고 가정해도 무방할 것 같죠? 그렇다면 N1QL이 익숙해 보일 뿐만 아니라 익숙하게 느껴지기 때문에 새로운 것을 배우지 않아도 구문을 거의 알고 있다는 사실 때문에 즉각적인 가치를 느낄 수 있습니다.
이제 몇 가지 쿼리를 실행하고 어떤 결과가 나오는지 살펴봅시다! 이 쿼리들은 온라인 튜토리얼/개발자 미리 보기 튜토리얼에 있는 샘플 '튜토리얼' 데이터 버킷에 대해 실행해 보겠습니다. 먼저 쿼리가 어떻게 형성되는지 살펴보겠습니다:
기본 쿼리는 세 부분으로 구성됩니다:
- 선택 - 반환할 문서의 일부
- FROM - 데이터 버킷 또는 작업할 데이터 저장소
- 어디 - 문서가 충족해야 하는 조건
쿼리에는 실제로 SELECT 절만 필요합니다. 와일드카드 *를 사용하여 SELECT 절을 실행하면 문서의 모든 부분을 선택하게 됩니다. 따라서 다음 쿼리를 실행하면 됩니다:
튜토리얼에서
WHERE fname = 'Dave'
저희는 여기에 표시된 데이터...
앞서 중첩 데이터 구조에 대해 배운 내용을 염두에 두고 * 와일드카드를 문서 'children' 와일드카드 대신 *를 사용하면 쿼리에서 문서의 일부만 반환할 수 있습니다.
따라서 실행하면 됩니다:
튜토리얼에서
WHERE fname = 'Dave'
다시 돌아오겠습니다:
"resultset": [
{
"children": [
{
"age": 17,
"fname": "Aiden",
"gender": "m"
},
{
"age": 2,
"fname": "Bill",
"gender": "m"
}
]
}
]
}
이제 다음 사항을 기억하세요. 고정 스키마 없음 를 사용하여 Couchbase의 놀라운 유연성을 잃지 않도록 했습니다. 여기서 고정된 스키마가 없다는 말은 Couchbase가 스키마를 강제하지 않는다는 뜻이지만, JSON 문서이기 때문에 우리 문서에는 당연히 구조가 있습니다.
N1QL 쿼리는 관계형 데이터베이스와 달리 행이나 열이 아닌 문서에 대해 작동합니다. 문서에는 중첩된 속성과 임베디드 배열이 있을 수 있으므로, 몇 가지 추가적인 연산자 가 필요합니다. N1QL에는 '.' 연산자와 자식을 참조하는 데 사용되는 '[ ]' 연산자는 배열의 요소를 참조하는 데 사용됩니다. 실제로 이 연산자를 조합하여 문서 내 모든 깊이의 데이터에 액세스할 수 있습니다.
예를 들어, 쿼리를 실행한 경우입니다:
튜토리얼에서
WHERE fname='Dave'
여기서는 첫 번째 자식의 이름과 명시적 별칭을 'cname'으로 가져오고 있습니다. 자식 문서의 속성은 AS 절을 사용합니다.
이 쿼리에서 반환되는 결과는 다음과 같습니다:
"resultset": [
{
"fname": "Aiden"
}
]
}
Couchbase와 같은 문서 데이터베이스는 종종 문서 외부에 문서에 대한 메타데이터를 저장합니다. N1QL에서는 'META()' 함수를 사용하여 샘플 튜토리얼 데이터베이스의 각 문서에 대한 메타데이터에 액세스할 수 있습니다. 이 쿼리에서 반환할 필드는 문서 메타데이터뿐입니다. 쿼리는 다음과 같습니다:
튜토리얼에서
그리고 그 결과 여기에서 볼 수 있습니다...
이전 쿼리에서는 '어디' 절을 사용하여 단일 문서를 일치시킬 수도 있지만, 다른 비교 연산자를 사용하여 여러 문서를 일치시킬 수도 있습니다. 예를 들어 데이터베이스에서 나이가 30세 이상인 모든 사람을 찾고 싶다고 가정하면 다음 쿼리를 실행할 수 있습니다:
튜토리얼에서
연령이 30세 이상인 경우
반환되는 항목 이 결과 집합...
(>, >=, <, <=, = 및 !=)와 같은 모든 표준 비교 연산자가 지원됩니다. 이러한 모든 비교 연산자는 값의 유형도 고려합니다. 점수 > 8은 8보다 큰 숫자 점수가 포함된 문서를 반환합니다.
제 생각에 가장 멋진 기능 중 하나는 패턴 매칭을 위해 '좋아요' 연산자를 사용해야 합니다. 예를 들어 데이터베이스에서 이메일 주소가 yahoo.com인 모든 사람을 찾아야 한다고 가정해 보겠습니다. '좋아요' 연산자를 사용하여 이메일 주소와 일치하도록 합니다. 이 쿼리에서는 0개 이상의 문자와 일치하는 와일드카드로 '%'를 사용합니다. 정확히 한 문자를 일치시켜야 하는 경우 '_'를 사용할 수도 있습니다. 따라서 데이터베이스에서 yahoo.com 이메일 주소를 사용하는 모든 사람을 찾는 쿼리는 다음과 같습니다:
튜토리얼에서
WHERE 이메일이 '%@yahoo.com' 같은 경우
보시다시피, 저희는 '좋아요' 연산자를 사용하여 이메일 주소와 일치하도록 합니다. 쿼리가 반환하는 결과 집합은 다음과 같습니다...
"resultset": [
{
"이메일": "harry@yahoo.com",
"fname": "Harry"
}
{
"이메일": "dave@yahoo.com",
"fname": "Dave"
}
]
}
개인적으로 이 기능이 N1QL의 가장 편리한 기능 중 하나라고 생각합니다! 하지만 방금 수행한 작업과 반대로 모든 사람을 나열하고 싶다고 가정해 보겠습니다. 하지 마십시오. yahoo.com 이메일 주소와 일치합니다. 또 다른 사악한 기능은 'NOT LIKE' 연산자를 사용하여 패턴과 일치하지 않는 문서를 찾을 수 있습니다.
물론 여러 조건을 결합하려면 'AND' 연산자를 사용합니다. 예를 들어, 자녀가 한 명 이상이고 Gmail 이메일 주소가 있는 사람들을 반환하려는 경우 실행합니다:
튜토리얼에서
여기서 길이(어린이) > 0이고 이메일이 '%@gmail.com' 같은 경우
''를 대체할 수도 있습니다.AND' 연산자와 함께 'OR' 연산자를 사용하여 여러 조건에 일치하도록 합니다.
쿼리 결과의 순서 지정 및 페이지 매김으로 넘어가면서 SQL 쿼리와의 유사성은 계속 이어집니다. N1QL에는 익숙한 '주문 기준' 절을 추가하여 쿼리 결과 집합의 순서를 지정할 수 있습니다. 데이터 세트가 매우 큰 경우 쿼리는 많은 결과를 생성할 수 있으므로 결과에 페이지 매김을 지정하고 싶을 수 있습니다. 좋은 소식입니다! 우리도 그렇게 할 수 있습니다! 쿼리에 '주문 기준' 절과 'LIMIT' 페이지는 다음과 같이 보일 수 있습니다:
튜토리얼에서
연령별 주문
제한 2
다음과 같은 명령을 사용하여 데이터 집합에 데이터 집계를 만들 수 있습니다. 'COUNT()' 함수를 사용하면 버킷에 얼마나 많은 문서가 있는지 알 수 있습니다. 또한 익숙한 'GROUP BY' 절을 사용할 수 있습니다. 반환되는 그룹을 기준으로 결과 집합을 필터링하려면 'HAVING' 절을 사용했다면, 'WHERE' 절을 사용하여 문서를 필터링합니다.
멤버가 2명 이상인 그룹만 반환하려면 다음과 같이 쿼리를 작성하면 됩니다:
튜토리얼에서
관계 기준 그룹화
카운트(*) > 1
마지막으로 언급하고 싶은 기능은 다음과 같은 기능을 사용할 수 있다는 사실입니다. 문서 내 조인(중첩 해제 또는 평면화라고도 함)을 수행합니다. 즉, 중첩된 배열의 내용을 가져와서 부모 객체와 조인할 수 있습니다. 예를 들어 Dave를 그의 두 자식 각각과 조인하려면 다음과 같은 쿼리를 작성할 수 있습니다:
FROM 튜토리얼 AS 연락처
OVER child IN contact.children
WHERE contact.fname = 'Dave'
이 쿼리는 다음과 같은 결과 집합을 반환합니다. 여기에서 볼 수 있습니다...
이것으로 제가 정말 자랑하고 싶었던 N1QL의 기능은 거의 마무리되었습니다. 개인적으로 저는 이 프로젝트가 가장 흥미로운 카우치베이스 프로젝트 중 하나라고 생각하며, N1QL의 구문이 정말 마음에 들고 프로젝트 자체도 환상적이라고 생각합니다.
N1QL 사용을 시작하려면 지금 바로 개발자 프리뷰를 다운로드할 수 있습니다. 커뮤니티 포털의 N1QL 섹션을 참조하세요.
15분 분량의 온라인 튜토리얼을 통해 더 자세히 알아보고 싶다면 다음과 같이 하세요. 여기에서 하세요.
N1QL에 대한 보다 심층적인 개발자 프리뷰 가이드가 필요한 경우 다음에서 공식 문서를 확인할 수 있습니다. 여기를 클릭하세요.
이 블로그를 통해 N1QL을 사용하는 것이 매우 재미있고 멋진 기술이라는 것을 알게 되셨기를 바랍니다. N1QL 세계로의 모험에 대해 궁금한 점이 있으시다면 언제든지 N1QL 커뮤니티 포털 전문가가 답변해 드립니다!
이제 N1QL의 세계로 뛰어들어 보세요! 거기서 뵙겠습니다!
- 로빈 존슨
개발자 옹호자, 유럽
Coooooooooooool!
오히려 그렇지 않습니까!
흥미롭군요. NIQL에는 임의의 결과 문서를 구성할 수 있는 연산자가 있나요? 예를 들어 \"dave\" 튜토리얼 문서를 다음과 같이 바꾸고 싶다고 가정해 보겠습니다:
{
결과 집합: [{
나이: 17,
fname: \"Aiden\",
gender: \"m\",
부모: {
fname: \"Dave\",
이메일: 이메일: \"dave@gmail.com\",
취미: [\"골프\",\"서핑\"],
lname: \"Smith\",
관계: \"친구\",
title: \"Mr.\",
유형: \"연락처\"
}
},{
나이: 2,
fname: \"Bill\",
gender: \"f\",
부모: {
fname: \"Dave\",
이메일: 이메일: \"dave@gmail.com\",
취미: [\"골프\",\"서핑\"],
lname: \"Smith\",
관계: \"친구\",
title: \"Mr.\",
유형: \"연락처\"
}
}]
}
롤랜드, 답변이 늦어져서 죄송합니다. 예, N1QL을 사용하면 임의의 변환 및 결과를 구성할 수 있습니다. 튜토리얼에서 다음 쿼리는 원하는 결과를 생성합니다:
SELECT * FROM 튜토리얼 부모 OVER parent.children WHERE parent.fname = \"Dave\"
-게랄드
제럴드, 고마워요!
지금은 약간 혼란스럽습니다. 이것은 \"문서 내 조인\" 기능에서 설명한 것과 정확히 동일한 쿼리(별칭 제외)처럼 보입니다. 그러나 해당 쿼리에 대해 주어진 결과 집합은 하위 속성이 포함된 \"child\" 속성이 있는 반면, 샘플 결과 집합에서는 해당 속성이 최상위 개체에 있다는 점에서 다릅니다.
제가 놓치고 있거나 잘못 해석한 것이 있나요?
안녕하세요, 롤랜드,
쿼리를 단순하게 유지하려고 노력했습니다 :). 언제든지 결과의 하위 집합을 투영할 수 있습니다. 다음 쿼리는 정확한 결과를 생성합니다:
SELECT parent, children.age, children.fname, children.gender FROM 튜토리얼 부모 OVER parent.children WHERE parent.fname = \"Dave\"
고마워요! 짐작할 수 있었을 것 같지만 설명해 주셔서 감사합니다. 좋은 정보입니다!
이 블로그 게시물이 이미 상당히 길다는 것을 알고 있지만 OVER 연산자의 작동 방식에 대해 좀 더 공식적이고 완전한 설명이 있으면 정말 감사하겠습니다. 링크가 있나요? 안녕하세요, 롤랜드.
Roland,
문서에 추가할 수 있고 추가할 예정이지만 여기에 약간의 내용이 있습니다:
http://docs.couchbase.com/couc…
참고로, 다음 개발자 프리뷰에서는 FROM ... OVER 구문이 FROM ... UNNEST로 연결되며, 이는 더 설명적인 구문으로 간주됩니다.
본질적으로 중첩 배열을 상위 문서 또는 객체와 개념적으로 결합하여 쌍의 목록을 생성하는 것입니다.
다른 질문이 있으시면 언제든지 문의해 주세요.
칭찬해 주셔서 감사합니다!
안녕하세요, N1QL 쿼리 언어의 내부 작동 방식에 대해 더 자세히 알고 싶습니다. 특히 디스크에 지속된 문서만 반환하는지 알고 싶습니다. 쿼리를 수행하기 위해 Couchbase 보기를 사용하나요? 성능 문제는 어떤가요?
이러한 질문에 대한 답변은 어디에서 찾을 수 있나요?
고마워요
N1QL은 현재 Couchbase 보기를 사용합니다. 따라서 현재 뷰에 표시되는 문서를 반환하며, 그 성능은 뷰의 성능을 기반으로 합니다.
저희는 N1QL을 위한 전용 인덱스 세트를 개발 중입니다. N1QL은 새로운 인덱스와 카우치베이스 보기를 모두 지원할 예정입니다. 또한 Couchbase 보기의 성능에 대해서도 작업 중입니다.
다음 주소로 직접 질문을 게시할 수도 있습니다. query.couchbase.com.
최근에 출시된 것으로 알고 있는데, N1QL을 couchbase lite에서 사용할 수 있나요? 자유 형식 데이터베이스를 허용하는 앱을 개발 중이므로 뷰를 미리 만들 수 없으므로 애드혹 쿼리가 필요할 것입니다.
N1QL은 현재 Couchbase Lite에서 제공되지 않지만 향후 제공을 검토하고 있습니다. 지금 당장 무엇을 사용해야 하는지에 대해서는 사용하려는 작업에 대한 자세한 정보가 있으면 도움이 될 것입니다. Couchbase Lite를 포함한 Couchbase Mobile에 대한 기술적 질문을 게시하기에 가장 좋은 곳은 모바일 Google 그룹입니다: https://groups.google.com/foru…
엔진에 특정 버전의 Couchbase 서버가 필요한가요, 아니면 이전 버전(예: 2.5)에서도 작동할 수 있나요?
Couchbase 서버 2.5.1에서 작동합니다.
개발자가 프로덕션 환경에서 사용할 수 있는 릴리스 날짜는 언제인가요?
출시 계획은 아직 조율 중이며, 2015년 상반기에 출시할 예정이니 계속 지켜봐 주시기 바랍니다.
하지만 그 전에 미리 보기를 제공할 예정이니, 사용 사례에 대해 알아보고 N1QL 사용 계획에 대한 자세한 정보를 얻고 싶으시다면 언제든지 문의해 주세요. 쿼리 정보 query.couchbase.com 를 통해 문의할 수도 있습니다. http://forums.couchbase.com/c/…
Couchbase 4.0 및 N1QL Server에서 업데이트 작업을 수행하는 동안 배열에 대한 반복 작업을 수행할 수 있나요? 예를 들어 :
\"UPDATE mybucket SET address.location=\'Office\' OVER child IN address WHERE child.type = \'Home\' END\"
(여기서 주소는 배열입니다).
위의 쿼리를 수행할 수 있나요?
이 코드는 어떤 언어인가요?کرکره برقی
프로그램 상태는 어떤가요?نهال پسته