Os recursos do N1QL estão chegando a mais e mais SDKs - agora incluindo o Ruby. Gostaria de fazer uma rápida introdução sobre como funcionam as consultas estruturadas em Ruby. No momento, a biblioteca não oferece um ODM ou alguma outra abstração de alto nível, mas praticamente tudo é possível de outra forma.
O suporte experimental para N1QL foi adicionado em Versão secundária recente 1.3.12 embora seja possível que a API seja alterada na versão final. Nos exemplos abaixo, mostrarei como trabalhar com ela usando novo conjunto de dados de viagensque está no Visualização para desenvolvedores do 4.0. Neste blog, estou assumindo que você instalou a versão mais recente do cliente ruby (caso contrário, execute "gem install -v 1.3.12
") e ter um Couchbase Server local com o serviço de consulta ativado.
Primeiro, vamos estabelecer uma conexão com o bucket:
1 |
cb = Couchbase.conectar(balde: 'travel-sample') |
O ponto de entrada para as consultas N1QL é Couchbase::Bucket#query
que aceita uma string em N1QL e retorna um hash com :rows
e :meta
onde a resposta do servidor foi entregue. Se houver um problema, a biblioteca levantará Couchbase::Error::Query
com metadados anexados para analisar o erro.
Por exemplo, vamos criar um índice primário para todo o conjunto de dados:
1 |
cb.consulta("CREATE PRIMARY INDEX on `travel-sample`") |
Com o índice primário definido, podemos buscar os documentos por suas chaves:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
cb.consulta('SELECT * FROM `travel-sample` USE KEYS ["airline_24"]') # => {:rows=> # [{"travel-sample"=> # {"indicativo"=>"AMERICAN", # "country"=>"Estados Unidos", # "iata"=>"AA", # "icao"=>"AAL", # "id"=>24, # "name"=>"American Airlines", # "type"=>"airline"}}], # :meta=> # {"requestID"=>"7cc10c30-ecb7-4e65-b582-fe9852e85d5b", # "signature"=>{"*"=>"*"}, # "results"=>[], # "status"=>"sucesso", # "métricas"=> # {"elapsedTime"=>"8.308061ms", # "executionTime"=>"8.206911ms", # "resultCount"=>1, # "resultSize"=>306}}} |
Para simplificar os exemplos, podemos usar a seguinte função para remover :meta
e extrair apenas os valores.
1 2 3 |
def faixa(doc) doc[:linhas] final |
Vamos responder a algumas perguntas sobre essa amostra de balde. Como você deve se lembrar, a amostra anterior de dados de cerveja continha cerca de 7 mil documentos, vamos ver quantos documentos esta tem:
1 2 |
faixa cb.consulta('SELECT COUNT(*) AS total FROM `travel-sample`') # => [{"total"=>31621}] |
Essa é uma excelente caixa de areia para nossos experimentos. Que tipo de documentos ela contém?
1 2 3 4 5 |
faixa cb.consulta('SELECT type, COUNT(*) AS total FROM `travel-sample` GROUP BY type') # => [{"total"=>1969, "tipo"=>"aeroporto"}, # {"total"=>5389, "type"=>"landmark"}, # {"total"=>187, "tipo"=>"companhia aérea"}, # {"total"=>24076, "type"=>"route"}] |
Como tarefa de casa, você pode explorar mais a estrutura do banco de dados de amostra. Por enquanto, vamos responder a algumas perguntas mais práticas. Quais rotas estão disponíveis para alguém em Los Angeles que deseja ver a Torre Eiffel em Paris? Uma implementação simples poderia ser assim (supondo que você saiba o que significam LAX e CDG).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
exigir 'date' rotas = faixa cb.consulta(' SELECIONAR companhia aérea.nome, rota.equipamentos, rota.cronograma DE `viagens-amostra` rota JUNTAR `viagens-amostra` companhia aérea ON chaves rota.companhia aérea ONDE rota.aeroporto de origem = "LAX" E rota.aeroporto de destino = "CDG" ') rotas.cada fazer |rota| coloca("--------------------------") coloca("#{route['name']} (#{route['equipment']})") coloca("--------------------------") rota['schedule'].each do |flight| dia = Data::ABBR_DAYNAMES[voo['day']] coloca("#{flight['flight']}: #{flight['utc']}, #{day}") final final |
Se você executar esse código, obterá uma tabela de tempo bem formatada de todas as rotas para ver a famosa torre, conforme mostrado abaixo.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
-------------------------- Delta Ar Linhas (388 772) -------------------------- DL024: 03:23:00, Sol DL856: 04:38:00, Sol DL124: 06:01:00, Sol DL249: 06:00:00, Sol DL142: 10:00:00, Mês DL757: 10:44:00, Terça-feira ... -------------------------- Ar Tahiti Nui (343) -------------------------- TN070: 06:03:00, Sol TN040: 08:39:00, Mês TN832: 11:42:00, Terça-feira TN752: 08:32:00, Terça-feira TN519: 23:33:00, Terça-feira TN278: 05:27:00, Terça-feira TN325: 18:07:00, Quarta ... |
Isso é tudo para a introdução no momento. Por favor, deixe seu feedback sobre a nova consulta. Em particular, diga-nos que tipo de suporte a Ruby você gostaria de ver!
parece bom, estou ansioso por uma amostra de node.js :)