Truy vấn dữ liệu bằng AQL

Trong chương này, chúng ta sẽ thảo luận về cách truy vấn dữ liệu với AQL. Chúng ta đã thảo luận trong các chương trước rằng ArangoDB đã phát triển ngôn ngữ truy vấn của riêng mình và nó có tên là AQL.

Bây giờ chúng ta hãy bắt đầu tương tác với AQL. Như hình bên dưới, trong giao diện web, nhấnAQL Editorđược đặt ở đầu thanh điều hướng. Một trình soạn thảo truy vấn trống sẽ xuất hiện.

Khi cần, bạn có thể chuyển sang trình chỉnh sửa từ chế độ xem kết quả và ngược lại, bằng cách nhấp vào tab Truy vấn hoặc tab Kết quả ở góc trên cùng bên phải như trong hình dưới đây -

Trong số những thứ khác, trình soạn thảo có chức năng tô sáng cú pháp, hoàn tác / làm lại và lưu truy vấn. Để tham khảo chi tiết, người ta có thể xem tài liệu chính thức. Chúng tôi sẽ nêu bật một số tính năng cơ bản và thường được sử dụng của trình soạn thảo truy vấn AQL.

Các nguyên tắc cơ bản về AQL

Trong AQL, một truy vấn đại diện cho kết quả cuối cùng cần đạt được, nhưng không phải là quá trình đạt được kết quả cuối cùng. Tính năng này thường được biết đến như một thuộc tính khai báo của ngôn ngữ. Hơn nữa, AQL có thể truy vấn cũng như sửa đổi dữ liệu và do đó có thể tạo các truy vấn phức tạp bằng cách kết hợp cả hai quy trình.

Xin lưu ý rằng AQL hoàn toàn tuân thủ ACID. Việc đọc hoặc sửa đổi các truy vấn sẽ kết thúc toàn bộ hoặc hoàn toàn không. Ngay cả việc đọc dữ liệu của tài liệu cũng sẽ kết thúc với một đơn vị dữ liệu nhất quán.

Chúng tôi thêm hai mới songsvào bộ sưu tập bài hát mà chúng tôi đã tạo. Thay vì nhập, bạn có thể sao chép truy vấn sau và dán vào trình soạn thảo 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

Nhấn nút Execute ở phía dưới bên trái.

Nó sẽ viết hai tài liệu mới trong songs bộ sưu tập.

Truy vấn này mô tả cách hoạt động của vòng lặp FOR trong AQL; nó lặp lại danh sách các tài liệu được mã hóa JSON, thực hiện các hoạt động được mã hóa trên từng tài liệu trong bộ sưu tập. Các hoạt động khác nhau có thể là tạo cấu trúc mới, lọc, chọn tài liệu, sửa đổi hoặc chèn tài liệu vào cơ sở dữ liệu (tham khảo ví dụ tức thời). Về bản chất, AQL có thể thực hiện các hoạt động CRUD một cách hiệu quả.

Để tìm tất cả các bài hát trong cơ sở dữ liệu của chúng tôi, hãy một lần nữa chúng tôi chạy truy vấn sau, tương đương với SELECT * FROM songs của cơ sở dữ liệu kiểu SQL (vì trình soạn thảo ghi nhớ truy vấn cuối cùng, hãy nhấn *New* nút để làm sạch trình chỉnh sửa) -

FOR song IN songs
RETURN song

Tập kết quả sẽ hiển thị danh sách các bài hát được lưu trong songs bộ sưu tập như thể hiện trong ảnh chụp màn hình bên dưới.

Các hoạt động như FILTER, SORTLIMIT có thể được thêm vào For loop để thu hẹp và sắp xếp kết quả.

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

Truy vấn trên sẽ đưa ra các bài hát được tạo sau năm 1940 trong tab Kết quả (xem hình bên dưới).

Khóa tài liệu được sử dụng trong ví dụ này, nhưng bất kỳ thuộc tính nào khác cũng có thể được sử dụng làm thuộc tính tương đương để lọc. Vì khóa tài liệu được đảm bảo là duy nhất, không nhiều hơn một tài liệu duy nhất sẽ khớp với bộ lọc này. Đối với các thuộc tính khác, điều này có thể không đúng. Để trả về một tập hợp con người dùng đang hoạt động (được xác định bởi một thuộc tính được gọi là trạng thái), được sắp xếp theo tên theo thứ tự tăng dần, chúng tôi sử dụng cú pháp sau:

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

Chúng tôi đã cố tình đưa vào ví dụ này. Ở đây, chúng tôi quan sát thấy một thông báo lỗi cú pháp truy vấn được AQL đánh dấu màu đỏ. Cú pháp này làm nổi bật các lỗi và hữu ích trong việc gỡ lỗi các truy vấn của bạn như được hiển thị trong ảnh chụp màn hình bên dưới.

Bây giờ hãy để chúng tôi chạy truy vấn chính xác (lưu ý sửa chữa) -

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

Truy vấn phức tạp trong AQL

AQL được trang bị nhiều chức năng cho tất cả các kiểu dữ liệu được hỗ trợ. Phép gán biến trong một truy vấn cho phép xây dựng các cấu trúc lồng nhau rất phức tạp. Bằng cách này, các hoạt động sử dụng nhiều dữ liệu di chuyển đến gần dữ liệu ở phần phụ trợ hơn là đối với máy khách (chẳng hạn như trình duyệt). Để hiểu điều này, trước tiên chúng ta hãy thêm thời lượng (độ dài) tùy ý cho các bài hát.

Chúng ta hãy bắt đầu với chức năng đầu tiên, tức là, chức năng Cập nhật -

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

Chúng ta có thể thấy một tài liệu đã được viết như trong ảnh chụp màn hình ở trên.

Bây giờ chúng tôi cũng cập nhật các tài liệu (bài hát) khác.

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

Bây giờ chúng tôi có thể kiểm tra xem tất cả các bài hát của chúng tôi có thuộc tính mới không length -

FOR song IN songs
RETURN song

Đầu ra

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

Để minh họa việc sử dụng các từ khóa khác của AQL như LET, FILTER, SORT, v.v., bây giờ chúng tôi định dạng thời lượng của bài hát trong mm:ss định dạng.

Truy vấn

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

Lần này chúng tôi sẽ trả lại tên bài hát cùng với thời lượng. CácReturn hàm cho phép bạn tạo một đối tượng JSON mới để trả về cho mỗi tài liệu đầu vào.

Bây giờ chúng ta sẽ nói về tính năng 'Tham gia' của cơ sở dữ liệu AQL.

Hãy để chúng tôi bắt đầu bằng cách tạo một bộ sưu tập composer_dob. Hơn nữa, chúng tôi sẽ tạo bốn tài liệu với ngày sinh giả định của các nhà soạn nhạc bằng cách chạy truy vấn sau trong hộp câu hỏi:

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

Để làm nổi bật sự tương đồng với SQL, chúng tôi trình bày một truy vấn vòng lặp FOR lồng nhau trong AQL, dẫn đến hoạt động REPLACE, lặp lại đầu tiên trong vòng lặp bên trong, trên tất cả dob của nhà soạn nhạc và sau đó trên tất cả các bài hát liên quan, tạo một tài liệu mới có thuộc tính song_with_composer_key thay cho song thuộc tính.

Đây là truy vấn -

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

Bây giờ chúng ta hãy chạy truy vấn FOR song IN songs RETURN song một lần nữa để xem bộ sưu tập bài hát đã thay đổi như thế nào.

Đầu ra

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

Truy vấn trên hoàn tất quá trình di chuyển dữ liệu, thêm vào composer_key cho mỗi bài hát.

Bây giờ, truy vấn tiếp theo lại là truy vấn vòng lặp FOR lồng nhau, nhưng lần này dẫn đến thao tác Tham gia, thêm tên của nhà soạn nhạc được liên kết (chọn với sự trợ giúp của `composer_key`) vào mỗi bài hát -

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

Đầu ra

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