*Ba Dum Tschhh* ... Está vendo o que eu fiz? Faz centavos? Entendeu? Haha.
Então... N1QL (pronuncia-se Nickel)... a nova linguagem de consulta de próxima geração do Couchbase; o que é isso? Bem, é uma linguagem extensível, legível/gravável por humanos, projetada de forma bastante genial para consultas ad-hoc e operacionais no Couchbase. Para aqueles que já estão familiarizados com a consulta no Couchbase, essa sinopse provavelmente fará sentido para você. Se não - bem, provavelmente não, então vou esclarecer um pouco mais.
Mas antes disso, devo informá-lo de que este artigo do blog não é o melhor lugar para você ir se quiser mergulhar de cabeça e começar a aprender N1QL. É uma visão do N1QL do ponto de vista de um desenvolvedor, incluindo o motivo pelo qual estou tão entusiasmado com ele e os recursos que tenho orgulho de destacar. Se você quiser começar a aprender sobre o N1QL, clique aqui. Ou, como alternativa, vá e experimente o Tutorial on-line. De qualquer forma, voltando ao esclarecimento do que quero dizer quando falo em N1QL...
"O N1QL é semelhante à linguagem SQL padrão para bancos de dados relacionais, mas também inclui recursos adicionais, que são adequados para bancos de dados orientados a documentos." O N1QL foi projetado como uma linguagem de consulta intuitiva para uso em bancos de dados estruturados com base em documentos em vez de tabelas. Para localizar e utilizar informações em um banco de dados orientado a documentos, é necessário ter a lógica e as expressões corretas para navegar em documentos e estruturas de documentos. O N1QL oferece uma camada de abstração clara e fácil de entender para consultar e recuperar informações em seu banco de dados de documentos.
Antes de prosseguirmos com o N1QL, vamos falar rapidamente sobre a modelagem de documentos no Couchbase. Como você provavelmente sabe, no Couchbase modelamos nossos documentos principalmente em JSON. Estamos todos familiarizados com o JSON, por isso não vou entrar em detalhes, mas uma coisa que precisamos ter em mente é o fato de que: nossos documentos JSON podem ter estruturas de dados aninhadas complexas, matrizes aninhadas e objetos que normalmente tornariam a consulta um problema. No entanto, ao contrário do SQL, o N1QL tem a capacidade de navegar em dados aninhados porque suporta o conceito de caminhos. Isso é muito legal. Podemos usar caminhos usando uma sintaxe de anotação de pontos para nos fornecer o local lógico de um atributo em um documento. Por exemplo, se tivéssemos um site de comércio eletrônico com documentos que contivessem os pedidos dos clientes, poderíamos procurar atributos dentro desses documentos, até um enésimo nível aninhado. Assim, se quiséssemos procurar a rua de entrega do cliente:
Muito legal, não é? Esse também é um dos grandes diferenciais que distinguem essa linguagem de consulta do SQL.
Como a maioria de vocês que está lendo este artigo, eu também venho de um ambiente SQL. Acredito que seja seguro presumir que 99% de vocês também tenham, certo? Se for o caso, perceberão que o N1QL não só parece familiar, mas também parece familiar, o que nos dá uma sensação instantânea de valor devido ao fato de quase conhecermos a sintaxe sem aprender nada novo.
Agora vamos executar algumas consultas e ver o que acontece! Para essas consultas, vou executá-las no bucket de dados de amostra "tutorial", conforme visto no tutorial on-line/tutorial do Developer Preview. Primeiro, vamos dar uma olhada em como as consultas são formadas:
Uma consulta básica tem três partes:
- SELECIONAR - Partes do documento a serem devolvidas
- DE - O bucket de dados ou o armazenamento de dados com o qual trabalhar
- ONDE - Condições que o documento deve satisfazer
A consulta realmente requer apenas a cláusula SELECT. Se executarmos a cláusula SELECT com um curinga *, estaremos selecionando todas as partes do documento. Portanto, se executarmos a consulta a seguir:
DO tutorial
WHERE fname = 'Dave'
Retornaremos o dados como visto aqui...
Tendo em mente o que aprendemos anteriormente sobre estruturas de dados aninhadas, se alterarmos esse * curinga para usar um dos atributos aninhados do documento 'crianças em vez do curinga *, podemos retornar da nossa consulta apenas um fragmento do documento.
Portanto, ao correr:
DO tutorial
WHERE fname = 'Dave'
Nós voltaremos:
"resultset": [
{
"crianças": [
{
"idade": 17,
"fname": "Aiden",
"gênero": "m"
},
{
"idade": 2,
"fname": "Bill",
"gênero": "m"
}
]
}
]
}
Agora lembre-se, temos NENHUM ESQUEMA FIXO no Couchbase para que não percamos nada da incrível flexibilidade que adoramos no Couchbase. Agora, quando digo que não temos um esquema fixo, quero dizer que o Couchbase não impõe um esquema; mas nossos documentos têm estrutura, é claro, já que são documentos JSON.
A consulta N1QL funciona com base em documentos, não em linhas ou colunas, ao contrário dos bancos de dados relacionais. Como os documentos podem ter atributos aninhados e matrizes incorporadas, alguns operadores são necessários. No N1QL, temos um '.' que é usado para se referir a crianças, e um operador '[ ]' que é usado para fazer referência a um elemento em uma matriz. Na verdade, podemos usar uma combinação dos operadores para acessar dados em qualquer profundidade em um documento.
Por exemplo, se executarmos a consulta:
DO tutorial
WHERE fname='Dave'
Aqui, estamos buscando o nome do primeiro filho e fazendo um alias explícito para "cname". Atributos de documentos filhos podem ser explicitamente associados usando o atributo AS cláusula.
O resultado que retornamos dessa consulta é:
"resultset": [
{
"fname": "Aiden"
}
]
}
Os bancos de dados de documentos, como o Couchbase, geralmente armazenam metadados sobre um documento fora do documento. No N1QL, usamos o 'META()' para acessar os metadados de cada documento no banco de dados do tutorial de amostra. Nessa consulta, os únicos campos que retornaremos são os metadados do documento. A consulta é a seguinte:
DO tutorial
E os resultados pode ser visto aqui...
Nas consultas anteriores, usamos o 'WHERE' para corresponder a um único documento, mas também podemos usar outros operadores de comparação para corresponder a vários documentos. Digamos, por exemplo, que queremos encontrar todos em nosso banco de dados cuja idade seja superior a 30 anos; podemos executar a seguinte consulta:
DO tutorial
WHERE idade > 30
Que retornará esse conjunto de resultados...
Todos os operadores de comparação padrão são suportados, como (>, >=, <, <=, = e !=). Todas essas comparações também consideram o tipo do valor, portanto pontuação > 8retornará documentos que contêm uma pontuação numérica maior que 8.
Um dos recursos mais interessantes, na minha opinião, é a maneira como podemos fazer a correspondência de padrões usando o 'LIKE' na cláusula WHERE. Digamos, por exemplo, que precisamos encontrar todos em nosso banco de dados que tenham um endereço de e-mail no yahoo.com. Podemos executar uma consulta usando o operador 'GOSTO para corresponder aos endereços de e-mail. Nessa consulta, usaremos o '%' como curinga, que corresponderá a 0 ou mais caracteres. Também poderíamos usar o "_" se precisássemos fazer a correspondência com exatamente um caractere. Portanto, a consulta para encontrar todos em nosso banco de dados que usam um endereço de e-mail yahoo.com é:
DO tutorial
WHERE email LIKE '%@yahoo.com'
Como você pode ver, incluímos o 'LIKE' em nossa cláusula WHERE para corresponder aos endereços de e-mail. O conjunto de resultados que a consulta retornará é o seguinte...
"resultset": [
{
"email": "harry@yahoo.com",
"fname": "Harry"
}
{
"email": "dave@yahoo.com",
"fname": "Dave"
}
]
}
Pessoalmente, acho que esse é um dos recursos mais úteis do N1QL! Mas digamos que queremos fazer o oposto do que acabamos de fazer e queremos listar todas as pessoas que não correspondem ao endereço de e-mail yahoo.com. Outro recurso interessante é o 'NÃO GOSTO que podemos usar para encontrar documentos que não correspondam ao padrão.
É claro que podemos combinar várias condições usando o 'E operador. Por exemplo, se quisermos retornar pessoas que tenham pelo menos um filho e um endereço de e-mail do gmail, executaríamos:
DO tutorial
WHERE LENGTH(children) > 0 AND email LIKE '%@gmail.com'
Também poderíamos substituir esse 'E com o operador 'OU para fazer a correspondência em várias condições.
As semelhanças com a consulta SQL continuam quando passamos para a ordenação e paginação dos resultados da consulta. O N1QL incluiu a conhecida função 'ORDER BY' para que possamos ordenar o conjunto de resultados da consulta. As consultas podem produzir muitos resultados se tivermos um conjunto de dados muito grande, portanto, talvez queiramos paginar nossos resultados. Boas notícias! Também podemos fazer isso! Uma consulta que inclui uma cláusula 'ORDER BY' e uma cláusula 'LIMIT' O paginador pode ter a seguinte aparência:
DO tutorial
ORDER BY idade
LIMITE 2
Podemos criar agregados de dados em nosso conjunto de dados utilizando comandos como o 'COUNT()' que nos informaria quantos documentos estão em nosso bucket. Também podemos agrupar nossos dados usando a conhecida função 'GROUP BY' cláusula. Se quisermos filtrar o conjunto de resultados no qual os grupos são retornados, podemos usar a cláusula 'HAVING' onde teríamos usado a cláusula 'ONDE para filtrar documentos.
Se quisermos retornar apenas os grupos que têm mais de um membro, podemos escrever uma consulta como a seguinte:
DO tutorial
relação GROUP BY
TENDO COUNT(*) > 1
Um último recurso que gostaria de mencionar é o fato de que podemos fazer junções no documento (também chamadas de unnesting ou flattening). Isso significa que podemos pegar o conteúdo de matrizes aninhadas e juntá-las ao objeto pai. Assim, por exemplo, se quisermos juntar Dave com cada um de seus 2 filhos, podemos escrever uma consulta como a seguinte:
FROM tutorial AS contato
OVER child IN contact.children
WHERE contato.fname = 'Dave'
Essa consulta retornaria o conjunto de resultados como você pode ver aqui...
Bem, isso resume os recursos do N1QL que eu realmente queria mostrar. Pessoalmente, acho que esse é um dos projetos mais interessantes do Couchbase. Adoro a sintaxe do N1QL e acho que o projeto em si é fantástico.
Se quiser começar a usar o N1QL, você pode fazer o download do Developer Preview agora, visitando o site Seção N1QL do nosso Portal da comunidade.
Se você quiser fazer um tutorial on-line de 15 minutos para se aprofundar no assunto, você pode faça isso aqui.
E se você quiser um guia mais detalhado do Developer Preview para o N1QL, poderá consultar os documentos oficiais em clicando aqui.
Espero que este blog tenha inspirado você a começar a usar o N1QL, pois ele é incrivelmente divertido de usar e uma tecnologia muito legal. Se tiver alguma dúvida em suas aventuras no mundo do N1QL, recomendo que pergunte em nosso Portal da comunidade N1QL e receba as respostas dos profissionais!
Vá em frente e mergulhe no mundo N1QL! Vejo você lá dentro!
- Robin Johnson
Representante de desenvolvedores, Europa
Que legal!
É sim, não é?
Interessante. O NIQL tem algum operador para construir documentos de resultados arbitrários? Por exemplo, suponha que eu queira transformar o documento do tutorial \"dave\" em algo como isto:
{
resultset: [{
idade: 17,
fname: \"Aiden\",
gênero: \"m\",
pai: {
fname: \"Dave\",
e-mail: \"dave@gmail.com\",
hobbies: [\"golf\",\"surfing\"],
Nome: \"Smith\",
relação: \"amigo\",
título: \"Mr.\",
Tipo: \"contato\"
}
},{
idade: 2,
fname: \"Bill\",
gênero: \"f\",
pai: {
fname: \"Dave\",
e-mail: \"dave@gmail.com\",
hobbies: [\"golf\",\"surfing\"],
Nome: \"Smith\",
relação: \"amigo\",
título: \"Mr.\",
Tipo: \"contato\"
}
}]
}
Roland, desculpe a demora na resposta. Sim, o N1QL permite que você construa transformações e resultados arbitrários. No tutorial, a consulta a seguir produzirá os resultados que você deseja:
SELECT * FROM tutorial parent OVER parent.children WHERE parent.fname = \"Dave\"
-gerald
Gerald, obrigado!
Estou um pouco confuso agora. Essa parece ser exatamente a mesma consulta (exceto pelo alias) que você descreve no recurso \"in-document joins\". No entanto, o conjunto de resultados fornecido para essa consulta é diferente, pois há propriedades \"child\" nas quais as propriedades "child" estão contidas, enquanto no meu conjunto de resultados de amostra essas propriedades estão no objeto de nível superior.
Estou perdendo ou interpretando mal alguma coisa?
Oi Roland,
Eu estava tentando manter a consulta simples :). Você sempre pode projetar qualquer subconjunto no resultado. A consulta a seguir produz seus resultados precisos:
SELECT parent, children.age, children.fname, children.gender FROM tutorial parent OVER parent.children WHERE parent.fname = \"Dave\"
Obrigado! Acho que eu poderia ter adivinhado, mas fico feliz com a explicação. Ótimo material!
Esqueci de acrescentar - sei que esta postagem do blog já está bem longa, mas eu realmente gostaria de receber uma explicação mais formal/completa de como o operador OVER funciona. Você tem um link? TIA, Roland.
Roland,
Há um pouco aqui, embora possamos (e iremos) aumentar a documentação:
http://docs.couchbase.com/couc…
Para sua informação, na próxima Developer Preview, a sintaxe FROM ... OVER será encadeada para FROM ... UNNEST, que consideramos mais descritiva.
Em essência, trata-se de unir conceitualmente uma matriz aninhada com seu documento ou objeto pai, para criar uma lista de pares .
Se tiver qualquer outra dúvida, teremos prazer em responder.
Obrigado pelos elogios!
Olá, estou interessado em saber mais sobre o funcionamento interno da linguagem de consulta N1QL. Especificamente, gostaria de saber se ela retorna apenas os documentos que foram persistidos em disco? Ela usa exibições do Couchbase para executar a consulta? E quanto a problemas de desempenho?
Onde posso encontrar respostas para essas perguntas?
Agradecimentos
Atualmente, o N1QL usa exibições do Couchbase. Dessa forma, ele retorna documentos que são visíveis às exibições e seu desempenho é baseado no desempenho das exibições.
Estamos trabalhando em um conjunto dedicado de índices para o N1QL. O N1QL será compatível com os novos índices e com as exibições do Couchbase. Também estamos trabalhando no desempenho das exibições do Couchbase.
Você também pode postar perguntas diretamente em query.couchbase.com.
Sei que foi lançado recentemente, mas o N1QL está disponível no couchbase lite? Tenho um aplicativo no qual estou trabalhando que permite um banco de dados de forma livre, portanto, não seria possível pré-criar exibições, de modo que uma consulta ad-hoc seria o que eu preciso.
No momento, o N1QL não está disponível no Couchbase Lite, mas estamos analisando-o para o futuro. Quanto ao que você deve usar no momento, seria útil se tivéssemos mais informações sobre o que você está tentando fazer. O melhor lugar para postar suas perguntas técnicas sobre o Couchbase Mobile, incluindo o Couchbase Lite, seria nosso grupo móvel do Google: https://groups.google.com/foru…
O mecanismo exige uma versão específica do servidor Couchbase ou pode operar com versões mais antigas, por exemplo, 2.5?
Ele funciona com o servidor Couchbase 2.5.1.
quando é a data de lançamento para que o desenvolvedor possa usá-lo no ambiente de produção.
Os planos de lançamento ainda estão sendo elaborados, fique atento aos anúncios. O plano provisório é disponibilizá-lo no primeiro semestre de 2015
No entanto, forneceremos visualizações prévias antes disso, portanto, entre em contato conosco, pois gostaríamos de conhecer o seu caso de uso e obter mais informações sobre o uso planejado para o N1QL. Queryinfo em query.couchbase.com e você também pode entrar em contato via http://forums.couchbase.com/c/…
Podemos fazer iteração sobre matrizes ao executar a operação de atualização no Couchbase 4.0 e no N1QL Server? Por exemplo, :
\"UPDATE mybucket SET address.location=\'Office\' OVER child IN address WHERE child.type = \'Home\' END\"
(o endereço é uma matriz aqui).
Podemos realizar a consulta acima?
Em que idioma está esse código?کرکره برقی
Como está a condição do programa?نهال پسته