이제 루비를 포함하여 점점 더 많은 SDK에 N1QL 기능이 제공되고 있습니다. Ruby에서 구조화된 쿼리가 어떻게 작동하는지에 대해 간단히 소개해드리고자 합니다. 현재 라이브러리는 ODM이나 그 위에 있는 다른 높은 수준의 추상화를 제공하지 않지만, 그렇지 않으면 거의 모든 것이 가능합니다.
N1QL에 대한 실험적 지원이 다음에서 추가되었습니다. 최근 마이너 릴리스 1.3.12 API가 최종 릴리스에서 변경될 수 있습니다. 아래 예제에서는 다음을 사용하여 작업하는 방법을 보여 드리겠습니다. 새로운 여행 데이터 세트에 있는 4.0 개발자 미리 보기. 이 블로그에서는 최신 버전의 루비 클라이언트를 설치했다고 가정하고 있습니다(그렇지 않은 경우 "gem 설치 -v 1.3.12") 및 쿼리 서비스가 활성화된 로컬 Couchbase 서버가 있어야 합니다.
먼저 버킷에 대한 연결을 설정해 보겠습니다:
|
1 |
cb = Couchbase.connect(bucket: 'travel-sample') |
N1QL 쿼리의 진입점은 다음과 같습니다. Couchbase::Bucket#query 메서드는 N1QL의 문자열을 받아 해시를 반환하고 행 그리고 메타 키에 서버의 응답을 전달합니다. 문제가 있는 경우 라이브러리에서 Couchbase::오류::쿼리 예외에 메타데이터를 첨부하여 오류를 분석합니다.
예를 들어 전체 데이터 세트에 대한 기본 인덱스를 생성해 보겠습니다:
|
1 |
cb.query("CREATE PRIMARY INDEX on `travel-sample`") |
기본 인덱스가 정의되면 해당 키로 문서를 가져올 수 있습니다:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
cb.query('SELECT * FROM `travel-sample` USE KEYS ["airline_24"]') # => {:rows=> # [{"travel-sample"=> # {"callsign"=>"AMERICAN", # "country"=>"United States", # "iata"=>"AA", # "icao"=>"AAL", # "id"=>24, # "name"=>"American Airlines", # "type"=>"airline"}}], # :meta=> # {"requestID"=>"7cc10c30-ecb7-4e65-b582-fe9852e85d5b", # "signature"=>{"*"=>"*"}, # "results"=>[], # "status"=>"success", # "metrics"=> # {"elapsedTime"=>"8.308061ms", # "executionTime"=>"8.206911ms", # "resultCount"=>1, # "resultSize"=>306}}} |
예제를 더 간단하게 만들기 위해 다음 함수를 사용하여 스트립할 수 있습니다. 메타 필드에서 값만 추출합니다.
|
1 2 3 |
def strip(doc) doc[:rows] end |
이 샘플 버킷에 대한 몇 가지 질문에 답해 보겠습니다. 이전 샘플 맥주 데이터에는 약 7천 개의 문서가 포함되어 있었는데, 이 데이터에는 얼마나 많은 문서가 있는지 살펴보겠습니다:
|
1 2 |
strip cb.query('SELECT COUNT(*) AS total FROM `travel-sample`') # => [{"total"=>31621}] |
실험을 위한 훌륭한 샌드박스입니다. 어떤 종류의 문서가 포함되어 있나요?
|
1 2 3 4 5 |
strip cb.query('SELECT type, COUNT(*) AS total FROM `travel-sample` GROUP BY type') # => [{"total"=>1969, "type"=>"airport"}, # {"total"=>5389, "type"=>"landmark"}, # {"total"=>187, "type"=>"airline"}, # {"total"=>24076, "type"=>"route"}] |
숙제로 샘플 데이터베이스의 구조를 더 자세히 살펴볼 수 있습니다. 지금은 좀 더 실용적인 질문에 답해 보겠습니다. 파리의 에펠탑을 보고 싶어하는 로스앤젤레스에 사는 사람이 이용할 수 있는 노선은 무엇일까요? 간단한 구현은 다음과 같이 보일 수 있습니다(LAX와 CDG의 의미를 알고 있다고 가정할 때).
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
require 'date' routes = strip cb.query(' SELECT airline.name, route.equipment, route.schedule FROM `travel-sample` route JOIN `travel-sample` airline ON keys route.airlineid WHERE route.sourceairport = "LAX" AND route.destinationairport = "CDG" ') routes.each do |route| puts("--------------------------") puts("#{route['name']} (#{route['equipment']})") puts("--------------------------") route['schedule'].each do |flight| day = Date::ABBR_DAYNAMES[flight['day']] puts("#{flight['flight']}: #{flight['utc']}, #{day}") end end |
이 코드를 실행하면 아래와 같이 유명한 타워를 볼 수 있는 모든 경로의 시간표가 멋지게 형식화되어 표시됩니다.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
-------------------------- Delta Air Lines (388 772) -------------------------- DL024: 03:23:00, Sun DL856: 04:38:00, Sun DL124: 06:01:00, Sun DL249: 06:00:00, Sun DL142: 10:00:00, Mon DL757: 10:44:00, Tue ... -------------------------- Air Tahiti Nui (343) -------------------------- TN070: 06:03:00, Sun TN040: 08:39:00, Mon TN832: 11:42:00, Tue TN752: 08:32:00, Tue TN519: 23:33:00, Tue TN278: 05:27:00, Tue TN325: 18:07:00, Wed ... |
현재 소개는 여기까지이며, 새로운 쿼리에 대한 피드백을 남겨 주세요. 특히 어떤 종류의 루비 지원이 있으면 좋겠는지 알려주세요!
멋져 보입니다, node.js 샘플을 기대하고 있습니다 :)