이제 루비를 포함하여 점점 더 많은 SDK에 N1QL 기능이 제공되고 있습니다. Ruby에서 구조화된 쿼리가 어떻게 작동하는지에 대해 간단히 소개해드리고자 합니다. 현재 라이브러리는 ODM이나 그 위에 있는 다른 높은 수준의 추상화를 제공하지 않지만, 그렇지 않으면 거의 모든 것이 가능합니다.
N1QL에 대한 실험적 지원이 다음에서 추가되었습니다. 최근 마이너 릴리스 1.3.12 API가 최종 릴리스에서 변경될 수 있습니다. 아래 예제에서는 다음을 사용하여 작업하는 방법을 보여 드리겠습니다. 새로운 여행 데이터 세트에 있는 4.0 개발자 미리 보기. 이 블로그에서는 최신 버전의 루비 클라이언트를 설치했다고 가정하고 있습니다(그렇지 않은 경우 "gem 설치 -v 1.3.12
") 및 쿼리 서비스가 활성화된 로컬 Couchbase 서버가 있어야 합니다.
먼저 버킷에 대한 연결을 설정해 보겠습니다:
1 |
cb = 카우치베이스.연결(버킷: 'travel-sample') |
N1QL 쿼리의 진입점은 다음과 같습니다. Couchbase::Bucket#query
메서드는 N1QL의 문자열을 받아 해시를 반환하고 행
그리고 메타
키에 서버의 응답을 전달합니다. 문제가 있는 경우 라이브러리에서 Couchbase::오류::쿼리
예외에 메타데이터를 첨부하여 오류를 분석합니다.
예를 들어 전체 데이터 세트에 대한 기본 인덱스를 생성해 보겠습니다:
1 |
cb.쿼리("`travel-sample`에 기본 인덱스 만들기") |
기본 인덱스가 정의되면 해당 키로 문서를 가져올 수 있습니다:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
cb.쿼리('SELECT * FROM `travel-sample` USE KEYS ["airline_24"]') # => {:rows=> # [{"travel-sample"=> # {"콜사인"=>"AMERICAN", # "국가"=>"미국", # "iata"=>"AA", # "icao"=>"AAL", # "id"=>24, # "이름"=>"아메리칸 항공", # "type"=>"항공사"}}], # :메타=> # {"requestID"=>"7cc10c30-ecb7-4e65-b582-fe9852e85d5b", # "signature"=>{"*"=>"*"}, # "results"=>[], # "상태"=>"성공", # "metrics"=> # {"elapsedTime"=>"8.308061ms", # "executionTime"=>"8.206911ms", # "resultCount"=>1, # "결과 크기"=>306}}} |
예제를 더 간단하게 만들기 위해 다음 함수를 사용하여 스트립할 수 있습니다. 메타
필드에서 값만 추출합니다.
1 2 3 |
def strip(doc) doc[:행] 끝 |
이 샘플 버킷에 대한 몇 가지 질문에 답해 보겠습니다. 이전 샘플 맥주 데이터에는 약 7천 개의 문서가 포함되어 있었는데, 이 데이터에는 얼마나 많은 문서가 있는지 살펴보겠습니다:
1 2 |
strip cb.쿼리('SELECT COUNT(*) AS total FROM `travel-sample`') # => [{"total"=>31621}] |
실험을 위한 훌륭한 샌드박스입니다. 어떤 종류의 문서가 포함되어 있나요?
1 2 3 4 5 |
strip cb.쿼리('SELECT type, COUNT(*) AS total FROM `travel-sample` GROUP BY type') # => [{"total"=>1969, "type"=>"airport"}, # {"총계"=>5389, "유형"=>"랜드마크"}, # {"total"=>187, "type"=>"항공사"}, # {"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' 경로 = strip cb.쿼리(' 선택 항공사.이름, 경로.장비, 경로.일정 FROM `여행-샘플` 경로 JOIN `여행-샘플` 항공사 켜기 키 경로.airlineid 어디 경로.소스공항 = "LAX" AND 경로.목적지공항 = "CDG" ') 경로.각 do |경로| 풋("--------------------------") 풋("#{route['name']} (#{route['equipment']})") 풋("--------------------------") 경로['schedule'].each do |flight| 일 = 날짜::ABBR_DAYNAMES[비행['day']] 풋("#{flight['flight']}: #{flight['utc']}, #{day}") 끝 끝 |
이 코드를 실행하면 아래와 같이 유명한 타워를 볼 수 있는 모든 경로의 시간표가 멋지게 형식화되어 표시됩니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
-------------------------- 델타 Air 라인 (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, 월 DL757: 10:44:00, 화요일 ... -------------------------- Air 타히티 Nui (343) -------------------------- TN070: 06:03:00, Sun TN040: 08:39:00, 월 TN832: 11:42:00, 화요일 TN752: 08:32:00, 화요일 TN519: 23:33:00, 화요일 TN278: 05:27:00, 화요일 TN325: 18:07:00, 수요일 ... |
현재 소개는 여기까지이며, 새로운 쿼리에 대한 피드백을 남겨 주세요. 특히 어떤 종류의 루비 지원이 있으면 좋겠는지 알려주세요!
멋져 보입니다, node.js 샘플을 기대하고 있습니다 :)