Abfragen der Daten mit AQL

In diesem Kapitel werden wir diskutieren, wie die Daten mit AQL abgefragt werden. Wir haben bereits in unseren vorherigen Kapiteln besprochen, dass ArangoDB eine eigene Abfragesprache entwickelt hat und dass sie den Namen AQL trägt.

Beginnen wir jetzt mit der Interaktion mit AQL. Drücken Sie wie in der Abbildung unten gezeigt in der Weboberfläche die TasteAQL EditorRegisterkarte oben in der Navigationsleiste. Ein leerer Abfrageeditor wird angezeigt.

Bei Bedarf können Sie von der Ergebnisansicht zum Editor wechseln und umgekehrt, indem Sie oben rechts auf die Registerkarten Abfrage oder Ergebnis klicken (siehe Abbildung unten).

Der Editor verfügt unter anderem über Syntaxhervorhebungen, Funktionen zum Rückgängigmachen / Wiederherstellen und zum Speichern von Abfragen. Für eine detaillierte Referenz kann man die offizielle Dokumentation sehen. Wir werden einige grundlegende und häufig verwendete Funktionen des AQL-Abfrage-Editors hervorheben.

AQL-Grundlagen

In AQL stellt eine Abfrage das zu erreichende Endergebnis dar, nicht jedoch den Prozess, durch den das Endergebnis erzielt werden soll. Diese Funktion wird allgemein als deklarative Eigenschaft der Sprache bezeichnet. Darüber hinaus kann AQL die Daten abfragen und ändern, sodass komplexe Abfragen durch Kombinieren beider Prozesse erstellt werden können.

Bitte beachten Sie, dass AQL vollständig ACID-konform ist. Das Lesen oder Ändern von Abfragen wird entweder vollständig oder gar nicht abgeschlossen. Selbst das Lesen der Daten eines Dokuments endet mit einer konsistenten Einheit der Daten.

Wir fügen zwei neue hinzu songszu der Songsammlung, die wir bereits erstellt haben. Anstatt zu tippen, können Sie die folgende Abfrage kopieren und in den AQL-Editor einfügen:

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

Drücken Sie die Execute-Taste unten links.

Es werden zwei neue Dokumente in die geschrieben songs Sammlung.

Diese Abfrage beschreibt, wie die FOR-Schleife in AQL funktioniert. Es durchläuft die Liste der JSON-codierten Dokumente und führt die codierten Vorgänge für jedes der Dokumente in der Sammlung aus. Die verschiedenen Vorgänge können das Erstellen neuer Strukturen, das Filtern, Auswählen von Dokumenten, Ändern oder Einfügen von Dokumenten in die Datenbank sein (siehe das aktuelle Beispiel). Im Wesentlichen kann AQL die CRUD-Operationen effizient ausführen.

Um alle Songs in unserer Datenbank zu finden, führen wir erneut die folgende Abfrage aus, die a entspricht SELECT * FROM songs einer SQL-Datenbank (da der Editor die letzte Abfrage speichert, drücken Sie die Taste *New* Schaltfläche zum Reinigen des Editors) -

FOR song IN songs
RETURN song

Die Ergebnismenge zeigt die Liste der bisher gespeicherten Songs in der songs Sammlung wie im Screenshot unten gezeigt.

Operationen wie FILTER, SORT und LIMIT kann dem hinzugefügt werden For loop Körper zu verengen und das Ergebnis zu ordnen.

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

Die obige Abfrage gibt Songs an, die nach dem Jahr 1940 auf der Registerkarte Ergebnis erstellt wurden (siehe Abbildung unten).

In diesem Beispiel wird der Dokumentschlüssel verwendet, aber jedes andere Attribut kann auch als Äquivalent zum Filtern verwendet werden. Da der Dokumentschlüssel garantiert eindeutig ist, entspricht nicht mehr als ein einzelnes Dokument diesem Filter. Bei anderen Attributen ist dies möglicherweise nicht der Fall. Um eine Teilmenge aktiver Benutzer zurückzugeben (bestimmt durch ein Attribut namens status), sortiert nach Namen in aufsteigender Reihenfolge, verwenden wir die folgende Syntax:

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

Wir haben dieses Beispiel bewusst aufgenommen. Hier beobachten wir eine Fehlermeldung zur Abfragesyntax, die von AQL rot hervorgehoben wird. Diese Syntax hebt die Fehler hervor und ist hilfreich beim Debuggen Ihrer Abfragen, wie im folgenden Screenshot gezeigt.

Lassen Sie uns nun die richtige Abfrage ausführen (beachten Sie die Korrektur) -

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

Komplexe Abfrage in AQL

AQL ist mit mehreren Funktionen für alle unterstützten Datentypen ausgestattet. Durch die Zuweisung von Variablen innerhalb einer Abfrage können sehr komplexe verschachtelte Konstrukte erstellt werden. Auf diese Weise rücken datenintensive Vorgänge näher an die Daten im Backend als an den Client (z. B. den Browser) heran. Um dies zu verstehen, fügen wir zunächst die willkürliche Dauer (Länge) zu den Songs hinzu.

Beginnen wir mit der ersten Funktion, dh der Update-Funktion -

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

Wir können sehen, dass ein Dokument wie im obigen Screenshot gezeigt geschrieben wurde.

Lassen Sie uns jetzt auch andere Dokumente (Songs) aktualisieren.

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

Wir können jetzt überprüfen, ob alle unsere Songs ein neues Attribut haben length - -

FOR song IN songs
RETURN song

Ausgabe

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

Um die Verwendung anderer Schlüsselwörter von AQL wie LET, FILTER, SORT usw. zu veranschaulichen, formatieren wir jetzt die Dauer des Songs in der mm:ss Format.

Abfrage

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

Dieses Mal geben wir den Songtitel zusammen mit der Dauer zurück. DasReturn Mit dieser Funktion können Sie ein neues JSON-Objekt erstellen, das für jedes Eingabedokument zurückgegeben wird.

Wir werden nun über die 'Joins'-Funktion der AQL-Datenbank sprechen.

Beginnen wir mit der Erstellung einer Sammlung composer_dob. Außerdem erstellen wir die vier Dokumente mit dem hypothetischen Geburtsdatum der Komponisten, indem wir die folgende Abfrage im Abfragefeld ausführen:

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

Um die Ähnlichkeit mit SQL hervorzuheben, präsentieren wir eine verschachtelte FOR-Loop-Abfrage in AQL, die zur REPLACE-Operation führt, die zuerst in der inneren Schleife über alle Dobs der Komponisten und dann über alle zugehörigen Songs iteriert und ein neues Dokument mit enthält Attribut song_with_composer_key anstelle von song Attribut.

Hier geht die Abfrage -

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

Lassen Sie uns nun die Abfrage ausführen FOR song IN songs RETURN song noch einmal, um zu sehen, wie sich die Liedersammlung verändert hat.

Ausgabe

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

Die obige Abfrage schließt den Datenmigrationsprozess ab und fügt die hinzu composer_key zu jedem Lied.

Jetzt ist die nächste Abfrage wieder eine verschachtelte FOR-Loop-Abfrage, diesmal jedoch mit dem Join-Vorgang, bei dem jedem Song der Name des zugeordneten Komponisten hinzugefügt wird (Auswahl mit Hilfe von "composer_key").

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

Ausgabe

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