Interroger les données avec AQL

Dans ce chapitre, nous verrons comment interroger les données avec AQL. Nous avons déjà discuté dans nos chapitres précédents qu'ArangoDB a développé son propre langage de requête et qu'il s'appelle AQL.

Commençons maintenant à interagir avec AQL. Comme le montre l'image ci-dessous, dans l'interface Web, appuyez sur le boutonAQL Editoronglet placé en haut de la barre de navigation. Un éditeur de requête vide apparaîtra.

En cas de besoin, vous pouvez basculer vers l'éditeur à partir de la vue des résultats et vice-versa, en cliquant sur les onglets Requête ou Résultat dans le coin supérieur droit comme indiqué dans l'image ci-dessous -

Entre autres choses, l'éditeur dispose de la coloration syntaxique, de la fonctionnalité d'annulation / restauration et de l'enregistrement des requêtes. Pour une référence détaillée, on peut consulter la documentation officielle. Nous mettrons en évidence quelques fonctionnalités de base et couramment utilisées de l'éditeur de requêtes AQL.

Fondamentaux AQL

Dans AQL, une requête représente le résultat final à atteindre, mais pas le processus par lequel le résultat final doit être atteint. Cette fonctionnalité est communément appelée propriété déclarative du langage. De plus, AQL peut interroger ainsi modifier les données, et ainsi des requêtes complexes peuvent être créées en combinant les deux processus.

Veuillez noter que AQL est entièrement compatible ACID. La lecture ou la modification des requêtes se terminera en totalité ou pas du tout. Même la lecture des données d'un document se terminera par une unité cohérente des données.

Nous ajoutons deux nouveaux songsà la collection de chansons que nous avons déjà créée. Au lieu de taper, vous pouvez copier la requête suivante et la coller dans l'éditeur 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

Appuyez sur le bouton Exécuter en bas à gauche.

Il écrira deux nouveaux documents dans le songs collection.

Cette requête décrit le fonctionnement de la boucle FOR dans AQL; il itère sur la liste des documents codés JSON, effectuant les opérations codées sur chacun des documents de la collection. Les différentes opérations peuvent être la création de nouvelles structures, le filtrage, la sélection de documents, la modification ou l'insertion de documents dans la base de données (voir l'exemple instantané). En substance, AQL peut effectuer les opérations CRUD de manière efficace.

Pour retrouver toutes les chansons de notre base de données, exécutons à nouveau la requête suivante, équivalente à un SELECT * FROM songs d'une base de données de type SQL (car l'éditeur mémorise la dernière requête, appuyez sur la touche *New* bouton pour nettoyer l'éditeur) -

FOR song IN songs
RETURN song

Le jeu de résultats affichera la liste des chansons enregistrées jusqu'à présent dans le songs collection comme indiqué dans la capture d'écran ci-dessous.

Opérations comme FILTER, SORT et LIMIT peut être ajouté au For loop corps pour affiner et ordonner le résultat.

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

La requête ci-dessus donnera les chansons créées après l'année 1940 dans l'onglet Résultat (voir l'image ci-dessous).

La clé de document est utilisée dans cet exemple, mais tout autre attribut peut également être utilisé comme équivalent pour le filtrage. Étant donné que la clé de document est garantie d'être unique, pas plus d'un seul document ne correspondra à ce filtre. Pour d'autres attributs, cela peut ne pas être le cas. Pour renvoyer un sous-ensemble d'utilisateurs actifs (déterminé par un attribut appelé status), triés par nom dans l'ordre croissant, nous utilisons la syntaxe suivante -

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

Nous avons délibérément inclus cet exemple. Ici, nous observons un message d'erreur de syntaxe de requête mis en évidence en rouge par AQL. Cette syntaxe met en évidence les erreurs et est utile pour déboguer vos requêtes, comme indiqué dans la capture d'écran ci-dessous.

Lançons maintenant la requête correcte (notez la correction) -

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

Requête complexe dans AQL

AQL est équipé de plusieurs fonctions pour tous les types de données pris en charge. L'affectation de variables dans une requête permet de créer des constructions imbriquées très complexes. De cette façon, les opérations gourmandes en données se rapprochent des données du backend plutôt que du client (tel que le navigateur). Pour comprendre cela, ajoutons d'abord les durées arbitraires (longueur) des chansons.

Commençons par la première fonction, c'est-à-dire la fonction Update -

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

Nous pouvons voir qu'un document a été écrit comme indiqué dans la capture d'écran ci-dessus.

Mettons maintenant à jour d'autres documents (chansons) aussi.

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

Nous pouvons maintenant vérifier que toutes nos chansons ont un nouvel attribut length -

FOR song IN songs
RETURN song

Production

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

Pour illustrer l'utilisation d'autres mots-clés de AQL tels que LET, FILTER, SORT, etc., nous formaterons maintenant les durées de la chanson dans le mm:ss format.

Requete

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

Cette fois, nous retournerons le titre de la chanson avec la durée. leReturn La fonction vous permet de créer un nouvel objet JSON à renvoyer pour chaque document d'entrée.

Nous allons maintenant parler de la fonctionnalité 'Joins' de la base de données AQL.

Commençons par créer une collection composer_dob. De plus, nous allons créer les quatre documents avec la date hypothétique de naissance des compositeurs en exécutant la requête suivante dans la zone de requête -

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

Pour mettre en évidence la similitude avec SQL, nous présentons une requête en boucle FOR imbriquée dans AQL, conduisant à l'opération REPLACE, en itérant d'abord dans la boucle interne, sur tous les dob des compositeurs puis sur toutes les chansons associées, créant un nouveau document contenant attribut song_with_composer_key à la place du song attribut.

Voici la requête -

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

Lançons maintenant la requête FOR song IN songs RETURN song à nouveau pour voir comment la collection de chansons a changé.

Production

[
   {
      "_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 requête ci-dessus termine le processus de migration des données, en ajoutant le composer_key à chaque chanson.

Maintenant, la requête suivante est à nouveau une requête en boucle FOR imbriquée, mais cette fois menant à l'opération Join, en ajoutant le nom du compositeur associé (en sélectionnant à l'aide de `composer_key`) à chaque chanson -

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

Production

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