Mengkueri Data dengan AQL

Pada bab ini, kita akan membahas bagaimana melakukan query data dengan AQL. Kita telah membahas di bab-bab sebelumnya bahwa ArangoDB telah mengembangkan bahasa kuerinya sendiri dan menggunakan nama AQL.

Mari kita mulai berinteraksi dengan AQL. Seperti yang ditunjukkan pada gambar di bawah ini, di antarmuka web, tekanAQL Editortab ditempatkan di bagian atas bilah navigasi. Editor kueri kosong akan muncul.

Bila perlu, Anda dapat beralih ke editor dari tampilan hasil dan sebaliknya, dengan mengklik Query atau tab Hasil di pojok kanan atas seperti yang ditunjukkan pada gambar di bawah -

Antara lain, editor memiliki penyorotan sintaks, fungsi undo / redo, dan penyimpanan kueri. Untuk referensi detailnya, bisa dilihat di dokumentasi resminya. Kami akan menyoroti beberapa fitur dasar dan umum digunakan dari editor kueri AQL.

Dasar-dasar AQL

Di AQL, kueri mewakili hasil akhir yang ingin dicapai, tetapi bukan proses untuk mencapai hasil akhir. Fitur ini umumnya dikenal sebagai properti deklaratif bahasa. Selain itu, AQL dapat melakukan kueri serta memodifikasi data, dan dengan demikian kueri kompleks dapat dibuat dengan menggabungkan kedua proses tersebut.

Harap dicatat bahwa AQL sepenuhnya sesuai dengan ACID. Membaca atau mengubah kueri akan berakhir seluruhnya atau tidak sama sekali. Bahkan membaca data dokumen akan selesai dengan unit data yang konsisten.

Kami menambahkan dua yang baru songsuntuk koleksi lagu yang telah kami buat. Alih-alih mengetik, Anda dapat menyalin kueri berikut, dan menempelkannya di 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

Tekan tombol Execute di kiri bawah.

Ini akan menulis dua dokumen baru di songs koleksi.

Query ini menjelaskan bagaimana loop FOR bekerja di AQL; itu mengulangi daftar dokumen yang dikodekan JSON, melakukan operasi berkode pada masing-masing dokumen dalam koleksi. Operasi yang berbeda dapat membuat struktur baru, memfilter, memilih dokumen, memodifikasi, atau menyisipkan dokumen ke dalam database (lihat contoh instan). Intinya, AQL dapat melakukan operasi CRUD secara efisien.

Untuk menemukan semua lagu dalam database kita, mari kita sekali lagi menjalankan query berikut, setara dengan a SELECT * FROM songs dari database tipe SQL (karena editor mengingat kueri terakhir, tekan *New* tombol untuk membersihkan editor) -

FOR song IN songs
RETURN song

Kumpulan hasil akan menampilkan daftar lagu yang sejauh ini disimpan di songs koleksi seperti yang ditunjukkan pada gambar di bawah.

Operasi seperti FILTER, SORT dan LIMIT dapat ditambahkan ke For loop tubuh untuk mempersempit dan mengurutkan hasilnya.

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

Permintaan di atas akan memberikan lagu yang dibuat setelah tahun 1940 di tab Hasil (lihat gambar di bawah).

Kunci dokumen digunakan dalam contoh ini, tetapi atribut lainnya juga dapat digunakan sebagai padanan untuk pemfilteran. Karena kunci dokumen dijamin unik, tidak lebih dari satu dokumen yang cocok dengan filter ini. Untuk atribut lain mungkin tidak demikian. Untuk mengembalikan subset pengguna aktif (ditentukan oleh atribut yang disebut status), diurutkan berdasarkan nama dalam urutan menaik, kami menggunakan sintaks berikut -

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

Kami sengaja memasukkan contoh ini. Di sini, kami mengamati pesan kesalahan sintaks kueri yang disorot dengan warna merah oleh AQL. Sintaks ini menyoroti kesalahan dan membantu dalam men-debug kueri Anda seperti yang ditunjukkan pada gambar di bawah.

Mari kita sekarang menjalankan kueri yang benar (perhatikan koreksi) -

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

Query Kompleks di AQL

AQL dilengkapi dengan banyak fungsi untuk semua tipe data yang didukung. Penugasan variabel dalam kueri memungkinkan pembuatan konstruksi bersarang yang sangat kompleks. Dengan cara ini, operasi intensif data bergerak lebih dekat ke data di backend daripada ke klien (seperti browser). Untuk memahami ini, pertama-tama mari kita tambahkan durasi (durasi) yang berubah-ubah pada lagu.

Mari kita mulai dengan fungsi pertama, yaitu fungsi Perbarui -

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

Kami dapat melihat satu dokumen telah ditulis seperti yang ditunjukkan pada gambar di atas.

Sekarang mari kita perbarui dokumen lain (lagu) juga.

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

Kami sekarang dapat memeriksa apakah semua lagu kami memiliki atribut baru length -

FOR song IN songs
RETURN song

Keluaran

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

Untuk mengilustrasikan penggunaan kata kunci AQL lain seperti LET, FILTER, SORT, dll., Sekarang kami memformat durasi lagu di mm:ss format.

Pertanyaan

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

Kali ini kami akan mengembalikan judul lagu beserta durasinya. ItuReturn fungsi memungkinkan Anda membuat objek JSON baru untuk dikembalikan untuk setiap dokumen masukan.

Sekarang kita akan berbicara tentang fitur 'Bergabung' dari database AQL.

Mari kita mulai dengan membuat koleksi composer_dob. Selanjutnya, kami akan membuat empat dokumen dengan hipotesis tanggal lahir para komposer dengan menjalankan kueri berikut di kotak kueri -

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

Untuk menyoroti kesamaan dengan SQL, kami menyajikan kueri FOR-loop bersarang di AQL, yang mengarah ke operasi REPLACE, melakukan iterasi pertama di loop dalam, di atas semua komposer dan kemudian pada semua lagu terkait, membuat dokumen baru yang berisi atribut song_with_composer_key alih-alih song atribut.

Ini dia kueri -

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

Sekarang mari kita menjalankan kueri FOR song IN songs RETURN song sekali lagi untuk melihat bagaimana koleksi lagu telah berubah.

Keluaran

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

Kueri di atas menyelesaikan proses migrasi data, menambahkan composer_key untuk setiap lagu.

Sekarang query berikutnya adalah query FOR-loop bertingkat, tapi kali ini mengarah ke operasi Join, menambahkan nama komposer terkait (memilih dengan bantuan `composer_key`) ke setiap lagu -

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

Keluaran

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