Consultando os dados com AQL
Neste capítulo, discutiremos como consultar os dados com AQL. Já discutimos em nossos capítulos anteriores que ArangoDB desenvolveu sua própria linguagem de consulta e que atende pelo nome de AQL.
Vamos agora começar a interagir com AQL. Conforme mostrado na imagem abaixo, na interface da web, pressione o botãoAQL Editorguia colocada na parte superior da barra de navegação. Um editor de consulta em branco aparecerá.
Quando necessário, você pode alternar para o editor a partir da visualização de resultados e vice-versa, clicando nas guias Consulta ou Resultado no canto superior direito conforme mostrado na imagem abaixo -
Entre outras coisas, o editor possui realce de sintaxe, funcionalidade desfazer / refazer e salvar consultas. Para uma referência detalhada, pode-se ver a documentação oficial. Vamos destacar alguns recursos básicos e comumente usados do editor de consulta AQL.
Fundamentos de AQL
Em AQL, uma consulta representa o resultado final a ser alcançado, mas não o processo pelo qual o resultado final deve ser alcançado. Esse recurso é comumente conhecido como uma propriedade declarativa da linguagem. Além disso, AQL pode consultar também modificar os dados e, portanto, consultas complexas podem ser criadas combinando os dois processos.
Observe que AQL é totalmente compatível com ACID. Ler ou modificar as consultas irá concluir totalmente ou não será concluído. Até a leitura dos dados de um documento terminará com uma unidade consistente dos dados.
Nós adicionamos dois novos songspara a coleção de músicas que já criamos. Em vez de digitar, você pode copiar a consulta a seguir e colá-la no editor AQL -
FOR song IN [
{
title: "Air-Minded Executive", lyricist: "Johnny Mercer",
composer: "Bernie Hanighen", Year: 1940, _key: "Air-Minded"
},
{
title: "All Mucked Up", lyricist: "Johnny Mercer", composer:
"Andre Previn", Year: 1974, _key: "All_Mucked"
}
]
INSERT song IN songs
Pressione o botão Executar no canto inferior esquerdo.
Ele vai escrever dois novos documentos no songs coleção.
Esta consulta descreve como o loop FOR funciona em AQL; ele itera sobre a lista de documentos codificados em JSON, realizando as operações codificadas em cada um dos documentos da coleção. As diferentes operações podem ser criar novas estruturas, filtrar, selecionar documentos, modificar ou inserir documentos na base de dados (ver o exemplo instantâneo). Em essência, AQL pode executar as operações CRUD com eficiência.
Para encontrar todas as músicas em nosso banco de dados, vamos mais uma vez executar a seguinte consulta, equivalente a um SELECT * FROM songs de um banco de dados do tipo SQL (porque o editor memoriza a última consulta, pressione o *New* botão para limpar o editor) -
FOR song IN songs
RETURN song
O conjunto de resultados mostrará a lista de músicas até agora salvas no songs coleção como mostrado na imagem abaixo.
Operações como FILTER, SORT e LIMIT pode ser adicionado ao For loop corpo para estreitar e ordenar o resultado.
FOR song IN songs
FILTER song.Year > 1940
RETURN song
A consulta acima fornecerá músicas criadas após o ano de 1940 na guia Resultado (veja a imagem abaixo).
A chave do documento é usada neste exemplo, mas qualquer outro atributo também pode ser usado como um equivalente para filtragem. Como a chave do documento tem garantia de ser exclusiva, não mais do que um único documento corresponderá a esse filtro. Para outros atributos, pode não ser o caso. Para retornar um subconjunto de usuários ativos (determinado por um atributo chamado status), classificados por nome em ordem crescente, usamos a seguinte sintaxe -
FOR song IN songs
FILTER song.Year > 1940
SORT song.composer
RETURN song
LIMIT 2
Incluímos deliberadamente este exemplo. Aqui, observamos uma mensagem de erro de sintaxe de consulta destacada em vermelho pela AQL. Esta sintaxe destaca os erros e é útil para depurar suas consultas, conforme mostrado na captura de tela abaixo.
Vamos agora executar a consulta correta (observe a correção) -
FOR song IN songs
FILTER song.Year > 1940
SORT song.composer
LIMIT 2
RETURN song
Consulta complexa em AQL
AQL é equipado com várias funções para todos os tipos de dados suportados. A atribuição de variáveis em uma consulta permite construir construções aninhadas muito complexas. Dessa forma, as operações com uso intensivo de dados se aproximam dos dados no back-end do que no cliente (como o navegador). Para entender isso, vamos primeiro adicionar as durações arbitrárias (duração) das músicas.
Vamos começar com a primeira função, ou seja, a função Atualizar -
UPDATE { _key: "All_Mucked" }
WITH { length: 180 }
IN songs
Podemos ver que um documento foi escrito conforme mostrado na imagem acima.
Vamos agora atualizar outros documentos (músicas) também.
UPDATE { _key: "Affable_Balding" }
WITH { length: 200 }
IN songs
Agora podemos verificar se todas as nossas músicas têm um novo atributo length -
FOR song IN songs
RETURN song
Resultado
[
{
"_key": "Air-Minded",
"_id": "songs/Air-Minded",
"_rev": "_VkC5lbS---",
"title": "Air-Minded Executive",
"lyricist": "Johnny Mercer",
"composer": "Bernie Hanighen",
"Year": 1940,
"length": 210
},
{
"_key": "Affable_Balding",
"_id": "songs/Affable_Balding",
"_rev": "_VkC4eM2---",
"title": "Affable Balding Me",
"lyricist": "Johnny Mercer",
"composer": "Robert Emmett Dolan",
"Year": 1950,
"length": 200
},
{
"_key": "All_Mucked",
"_id": "songs/All_Mucked",
"_rev": "_Vjah9Pu---",
"title": "All Mucked Up",
"lyricist": "Johnny Mercer",
"composer": "Andre Previn",
"Year": 1974,
"length": 180
},
{
"_key": "Accentchuate_The",
"_id": "songs/Accentchuate_The",
"_rev": "_VkC3WzW---",
"title": "Accentchuate The Politics",
"lyricist": "Johnny Mercer",
"composer": "Harold Arlen",
"Year": 1944,
"length": 190
}
]
Para ilustrar o uso de outras palavras-chave de AQL, como LET, FILTER, SORT, etc., agora formataremos as durações da música no mm:ss formato.
Inquerir
FOR song IN songs
FILTER song.length > 150
LET seconds = song.length % 60
LET minutes = FLOOR(song.length / 60)
SORT song.composer
RETURN
{
Title: song.title,
Composer: song.composer,
Duration: CONCAT_SEPARATOR(':',minutes, seconds)
}
Desta vez, retornaremos o título da música junto com a duração. oReturn função permite criar um novo objeto JSON para retornar para cada documento de entrada.
Agora falaremos sobre o recurso 'Joins' do banco de dados AQL.
Vamos começar criando uma coleção composer_dob. Além disso, criaremos os quatro documentos com a data hipotética de nascimento dos compositores executando a seguinte consulta na caixa de consulta -
FOR dob IN [
{composer: "Bernie Hanighen", Year: 1909}
,
{composer: "Robert Emmett Dolan", Year: 1922}
,
{composer: "Andre Previn", Year: 1943}
,
{composer: "Harold Arlen", Year: 1910}
]
INSERT dob in composer_dob
Para destacar a semelhança com SQL, apresentamos uma consulta FOR-loop aninhada em AQL, levando à operação REPLACE, iterando primeiro no loop interno, sobre todos os dob dos compositores e depois em todas as músicas associadas, criando um novo documento contendo atributo song_with_composer_key ao invés de song atributo.
Aqui vai a consulta -
FOR s IN songs
FOR c IN composer_dob
FILTER s.composer == c.composer
LET song_with_composer_key = MERGE(
UNSET(s, 'composer'),
{composer_key:c._key}
)
REPLACE s with song_with_composer_key IN songs
Vamos agora executar a consulta FOR song IN songs RETURN song novamente para ver como a coleção de músicas mudou.
Resultado
[
{
"_key": "Air-Minded",
"_id": "songs/Air-Minded",
"_rev": "_Vk8kFoK---",
"Year": 1940,
"composer_key": "5501",
"length": 210,
"lyricist": "Johnny Mercer",
"title": "Air-Minded Executive"
},
{
"_key": "Affable_Balding",
"_id": "songs/Affable_Balding",
"_rev": "_Vk8kFoK--_",
"Year": 1950,
"composer_key": "5505",
"length": 200,
"lyricist": "Johnny Mercer",
"title": "Affable Balding Me"
},
{
"_key": "All_Mucked",
"_id": "songs/All_Mucked",
"_rev": "_Vk8kFoK--A",
"Year": 1974,
"composer_key": "5507",
"length": 180,
"lyricist": "Johnny Mercer",
"title": "All Mucked Up"
},
{
"_key": "Accentchuate_The",
"_id": "songs/Accentchuate_The",
"_rev": "_Vk8kFoK--B",
"Year": 1944,
"composer_key": "5509",
"length": 190,
"lyricist": "Johnny Mercer",
"title": "Accentchuate The Politics"
}
]
A consulta acima completa o processo de migração de dados, adicionando o composer_key para cada música.
Agora a próxima consulta é novamente uma consulta FOR-loop aninhada, mas desta vez levando à operação Join, adicionando o nome do compositor associado (escolhendo com a ajuda de `composer_key`) para cada música -
FOR s IN songs
FOR c IN composer_dob
FILTER c._key == s.composer_key
RETURN MERGE(s,
{ composer: c.composer }
)
Resultado
[
{
"Year": 1940,
"_id": "songs/Air-Minded",
"_key": "Air-Minded",
"_rev": "_Vk8kFoK---",
"composer_key": "5501",
"length": 210,
"lyricist": "Johnny Mercer",
"title": "Air-Minded Executive",
"composer": "Bernie Hanighen"
},
{
"Year": 1950,
"_id": "songs/Affable_Balding",
"_key": "Affable_Balding",
"_rev": "_Vk8kFoK--_",
"composer_key": "5505",
"length": 200,
"lyricist": "Johnny Mercer",
"title": "Affable Balding Me",
"composer": "Robert Emmett Dolan"
},
{
"Year": 1974,
"_id": "songs/All_Mucked",
"_key": "All_Mucked",
"_rev": "_Vk8kFoK--A",
"composer_key": "5507",
"length": 180,
"lyricist": "Johnny Mercer",
"title": "All Mucked Up",
"composer": "Andre Previn"
},
{
"Year": 1944,
"_id": "songs/Accentchuate_The",
"_key": "Accentchuate_The",
"_rev": "_Vk8kFoK--B",
"composer_key": "5509",
"length": 190,
"lyricist": "Johnny Mercer",
"title": "Accentchuate The Politics",
"composer": "Harold Arlen"
}
]