Arangodb-querying-data-with-aql

提供:Dev Guides
移動先:案内検索

AQLを使用したデータのクエリ

この章では、AQLを使用してデータをクエリする方法について説明します。 前の章で、ArangoDBが独自のクエリ言語を開発し、AQLという名前であることを既に説明しました。

それでは、AQLとの対話を始めましょう。 以下の画像に示すように、Webインターフェースで、ナビゲーションバーの上部にある AQL Editor タブを押します。 空のクエリエディターが表示されます。

必要に応じて、下の画像に示すように右上隅のクエリまたは結果タブをクリックして、結果ビューからエディターに切り替えることができます-

結果ビューからエディターに切り替える

とりわけ、エディタには構文の強調表示、元に戻す/やり直し機能、クエリの保存があります。 詳細なリファレンスについては、公式ドキュメントをご覧ください。 AQLクエリエディタの基本的で一般的に使用されるいくつかの機能を強調します。

AQLの基礎

AQLでは、クエリは達成される最終結果を表しますが、最終結果が達成されるプロセスではありません。 この機能は、一般的に言語の宣言的プロパティとして知られています。 さらに、AQLはデータをクエリすることも変更することもできるため、両方のプロセスを組み合わせて複雑なクエリを作成できます。

AQLは完全にACIDに準拠していることに注意してください。 クエリの読み取りまたは変更は、全体的に完了するか、まったく完了しません。 文書のデータを読んでも、一貫したデータ単位で終了します。

作成済みの曲コレクションに2つの新しい*曲*を追加します。 入力する代わりに、次のクエリをコピーして、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

左下の実行ボタンを押します。

*songs* コレクションに2つの新しいドキュメントを書き込みます。

このクエリは、AQLでのFORループの動作を説明しています。 JSONでエンコードされたドキュメントのリストを反復処理し、コレクション内のドキュメントのそれぞれに対してコード化された操作を実行します。 さまざまな操作には、新しい構造の作成、ドキュメントのフィルタリング、選択、変更、データベースへのドキュメントの挿入などがあります(瞬間的な例を参照)。 本質的に、AQLはCRUD操作を効率的に実行できます。

データベース内のすべての曲を検索するには、SQLタイプのデータベースの SELECT FROM曲*に相当する次のクエリをもう一度実行します(エディターは最後のクエリを記憶しているため、* New *ボタンを押しますエディタをきれいにするために)-

FOR song IN songs
RETURN song

結果セットには、以下のスクリーンショットに示すように、 songs コレクションに保存されている曲のリストが表示されます。

曲のリスト

*FILTER、SORT* 、および *LIMIT* などの操作を* Forループ*本体に追加して、結果を絞り込んで順序付けることができます。
FOR song IN songs
FILTER song.Year > 1940
RETURN song

上記のクエリは、[結果]タブで1940年以降に作成された曲を提供します(下の画像を参照)。

1940年以降に作成された曲のクエリ

この例ではドキュメントキーが使用されていますが、その他の属性もフィルタリングの同等物として使用できます。 ドキュメントキーは一意であることが保証されているため、このフィルタに一致するドキュメントは1つだけです。 他の属性の場合、これは当てはまらない場合があります。 名前で昇順でソートされた、アクティブなユーザーのサブセット(ステータスと呼ばれる属性によって決定される)を返すには、次の構文を使用します-

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

この例を意図的に含めました。 ここでは、AQLによって赤で強調表示されたクエリ構文エラーメッセージを確認します。 この構文はエラーを強調表示し、下のスクリーンショットに示すようにクエリのデバッグに役立ちます。

構文がエラーを強調表示

私たちは今、正しいクエリを実行しましょう(修正に注意してください)-

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

正しいクエリの実行

AQLの複雑なクエリ

AQLには、サポートされているすべてのデータ型に対して複数の機能が装備されています。 クエリ内の変数の割り当てにより、非常に複雑なネストされた構造を構築できます。 このようにして、データ集約型の操作は、クライアント(ブラウザなど)よりもバックエンドのデータに近づきます。 これを理解するために、最初に任意の長さ(長さ)を曲に追加しましょう。

最初の関数、つまり更新関数から始めましょう-

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

AQLの複雑なクエリ

上記のスクリーンショットに示すように、1つのドキュメントが作成されていることがわかります。

他のドキュメント(曲)も更新しましょう。

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

これで、すべての曲に length という新しい属性があることを確認できます-

FOR song IN songs
RETURN song

出力

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

LET、FILTER、SORTなど、AQLの他のキーワードの使用を説明するために、曲の長さを mm:ss 形式でフォーマットします。

問い合わせ

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

AQL 2の複雑なクエリ

今回は、曲のタイトルと長さを返します。 Return 関数を使用すると、入力ドキュメントごとに返す新しいJSONオブジェクトを作成できます。

次に、AQLデータベースの「結合」機能について説明します。

コレクション composer_dob を作成することから始めましょう。 さらに、クエリボックスで次のクエリを実行することにより、作曲家の仮想的な誕生日の4つのドキュメントを作成します-

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

Composer DOB

SQLとの類似性を強調するために、AQLでネストされたFORループクエリを提示し、REPLACE操作を行います。最初に内側のループで、すべての作曲家のdobで、次に関連するすべての曲で繰り返し、 song 属性の代わりに song_with_composer_key 属性。

ここにクエリがあります-

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

Song Wth Composer Key

ここでクエリ FOR song IN songs RETURN song を再度実行して、曲のコレクションがどのように変更されたかを確認します。

出力

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

上記のクエリはデータ移行プロセスを完了し、各曲に composer_key を追加します。

これで、次のクエリはネストされたFORループクエリになりますが、今度は参加操作につながり、関連する作曲家の名前( `composer_key`の助けを借りて)を各曲に追加します-

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

出力

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

各曲への作曲者キーの追加