Interrogare i dati con AQL

In questo capitolo, discuteremo come interrogare i dati con AQL. Abbiamo già discusso nei nostri capitoli precedenti che ArangoDB ha sviluppato un proprio linguaggio di query e che si chiama AQL.

Cominciamo ora a interagire con AQL. Come mostrato nell'immagine sotto, nell'interfaccia web, premere il tastoAQL Editorscheda posizionata nella parte superiore della barra di navigazione. Apparirà un editor di query vuoto.

Quando necessario, puoi passare all'editor dalla visualizzazione dei risultati e viceversa, facendo clic sulle schede Query o Risultato nell'angolo in alto a destra come mostrato nell'immagine sottostante -

Tra le altre cose, l'editor ha l'evidenziazione della sintassi, funzionalità di annullamento / ripristino e salvataggio delle query. Per un riferimento dettagliato, si può vedere la documentazione ufficiale. Evidenzieremo alcune funzionalità di base e di uso comune dell'editor di query AQL.

Fondamenti di AQL

In AQL, una query rappresenta il risultato finale da ottenere, ma non il processo attraverso il quale il risultato finale deve essere raggiunto. Questa funzionalità è comunemente nota come proprietà dichiarativa della lingua. Inoltre, AQL può interrogare e modificare i dati e quindi è possibile creare query complesse combinando entrambi i processi.

Tieni presente che AQL è interamente conforme ad ACID. Leggere o modificare le query si concluderà per intero o per niente. Anche la lettura dei dati di un documento terminerà con un'unità di dati coerente.

Aggiungiamo due nuovi songsalla raccolta di canzoni che abbiamo già creato. Invece di digitare, puoi copiare la seguente query e incollarla nell'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

Premere il pulsante Execute in basso a sinistra.

Scriverà due nuovi documenti nel file songs collezione.

Questa query descrive come funziona il ciclo FOR in AQL; itera sulla lista dei documenti codificati JSON, eseguendo le operazioni codificate su ciascuno dei documenti nella raccolta. Le diverse operazioni possono essere la creazione di nuove strutture, il filtraggio, la selezione di documenti, la modifica o l'inserimento di documenti nel database (fare riferimento all'esempio istantaneo). In sostanza, AQL può eseguire le operazioni CRUD in modo efficiente.

Per trovare tutte le canzoni nel nostro database, eseguiamo ancora una volta la seguente query, equivalente a un file SELECT * FROM songs di un database di tipo SQL (poiché l'editor memorizza l'ultima query, premere il tasto *New* pulsante per pulire l'editor) -

FOR song IN songs
RETURN song

Il set di risultati mostrerà l'elenco delle canzoni finora salvate nel file songs raccolta come mostrato nello screenshot qui sotto.

Operazioni come FILTER, SORT e LIMIT può essere aggiunto al file For loop corpo per restringere e ordinare il risultato.

FOR song IN songs
FILTER song.Year > 1940
RETURN song

La query di cui sopra darà brani creati dopo l'anno 1940 nella scheda Risultato (vedi l'immagine sotto).

La chiave del documento viene utilizzata in questo esempio, ma qualsiasi altro attributo può essere utilizzato anche come equivalente per il filtro. Poiché la chiave del documento è garantita come univoca, non più di un singolo documento corrisponderà a questo filtro. Per altri attributi questo potrebbe non essere il caso. Per restituire un sottoinsieme di utenti attivi (determinati da un attributo chiamato status), ordinati per nome in ordine crescente, utilizziamo la seguente sintassi:

FOR song IN songs
FILTER song.Year > 1940
SORT song.composer
RETURN song
LIMIT 2

Abbiamo deliberatamente incluso questo esempio. Qui, osserviamo un messaggio di errore di sintassi della query evidenziato in rosso da AQL. Questa sintassi evidenzia gli errori ed è utile per il debug delle query come mostrato nello screenshot qui sotto.

Eseguiamo ora la query corretta (nota la correzione) -

FOR song IN songs
FILTER song.Year > 1940
SORT song.composer
LIMIT 2
RETURN song

Query complessa in AQL

AQL è dotato di molteplici funzioni per tutti i tipi di dati supportati. L'assegnazione di variabili all'interno di una query consente di costruire costrutti annidati molto complessi. In questo modo le operazioni ad alta intensità di dati si spostano più vicino ai dati sul back-end che sul client (come il browser). Per capirlo, aggiungiamo prima le durate arbitrarie (lunghezza) alle canzoni.

Cominciamo con la prima funzione, cioè la funzione Aggiorna -

UPDATE { _key: "All_Mucked" }
WITH { length: 180 }
IN songs

Possiamo vedere che un documento è stato scritto come mostrato nello screenshot qui sopra.

Aggiorniamo ora anche altri documenti (canzoni).

UPDATE { _key: "Affable_Balding" }
WITH { length: 200 }
IN songs

Ora possiamo verificare che tutte le nostre canzoni abbiano un nuovo attributo length -

FOR song IN songs
RETURN song

Produzione

[
   {
      "_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
   }
]

Per illustrare l'uso di altre parole chiave di AQL come LET, FILTER, SORT, ecc., Ora formattiamo le durate del brano nel mm:ss formato.

Query

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) 
}

Questa volta restituiremo il titolo del brano insieme alla durata. IlReturn consente di creare un nuovo oggetto JSON da restituire per ogni documento di input.

Ora parleremo della funzionalità "Join" del database AQL.

Cominciamo creando una collezione composer_dob. Inoltre, creeremo i quattro documenti con l'ipotetica data di nascita dei compositori eseguendo la seguente query nella casella delle query:

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

Per evidenziare la somiglianza con SQL, presentiamo una query FOR-loop annidata in AQL, che porta all'operazione REPLACE, iterando prima nel loop interno, su tutti i dob dei compositori e poi su tutte le canzoni associate, creando un nuovo documento contenente attributo song_with_composer_key invece di song attributo.

Ecco la domanda:

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

Eseguiamo ora la query FOR song IN songs RETURN song di nuovo per vedere come è cambiata la raccolta di brani.

Produzione

[
   {
      "_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"
   }
]

La query precedente completa il processo di migrazione dei dati, aggiungendo l'estensione composer_key a ogni canzone.

Ora la query successiva è di nuovo una query FOR-loop annidata, ma questa volta porta all'operazione Join, aggiungendo il nome del compositore associato (selezionandolo con l'aiuto di `composer_key`) a ciascuna canzone -

FOR s IN songs
FOR c IN composer_dob
FILTER c._key == s.composer_key
RETURN MERGE(s,
{ composer: c.composer }
)

Produzione

[
   {
      "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"
   }
]