AQL로 데이터 쿼리
이 장에서는 AQL을 사용하여 데이터를 쿼리하는 방법에 대해 설명합니다. 우리는 ArangoDB가 자체 쿼리 언어를 개발했으며 AQL이라는 이름으로 사용된다는 이전 장에서 이미 논의했습니다.
이제 AQL과 상호 작용을 시작하겠습니다. 아래 이미지와 같이 웹 인터페이스에서AQL Editor탐색 표시 줄 상단에있는 탭. 빈 쿼리 편집기가 나타납니다.
필요한 경우 아래 이미지와 같이 오른쪽 상단의 쿼리 또는 결과 탭을 클릭하여 결과보기에서 편집기로 전환하거나 그 반대로 전환 할 수 있습니다.
무엇보다도 편집기에는 구문 강조 표시, 실행 취소 / 다시 실행 기능 및 쿼리 저장이 있습니다. 자세한 참조는 공식 문서를 참조하십시오. AQL 쿼리 편집기의 몇 가지 기본적이고 일반적으로 사용되는 기능을 강조합니다.
AQL 기초
AQL에서 쿼리는 달성 할 최종 결과를 나타내지 만 최종 결과가 달성되는 프로세스가 아닙니다. 이 기능은 일반적으로 언어의 선언적 속성으로 알려져 있습니다. 또한 AQL은 데이터를 쿼리하고 수정할 수 있으므로 두 프로세스를 결합하여 복잡한 쿼리를 생성 할 수 있습니다.
AQL은 전적으로 ACID를 준수합니다. 쿼리를 읽거나 수정하면 전체가 종료되거나 전혀 종료되지 않습니다. 문서의 데이터를 읽는 것조차 일관된 데이터 단위로 완료됩니다.
우리는 두 가지 새로운 songs우리가 이미 만든 노래 컬렉션에. 입력하는 대신 다음 쿼리를 복사하여 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 수집.
이 쿼리는 FOR 루프가 AQL에서 작동하는 방식을 설명합니다. JSON으로 인코딩 된 문서 목록을 반복하여 컬렉션의 각 문서에 대해 코딩 된 작업을 수행합니다. 다른 작업으로는 새 구조 만들기, 필터링, 문서 선택, 문서 수정 또는 데이터베이스에 문서 삽입 (즉시 예제 참조)이 있습니다. 본질적으로 AQL은 CRUD 작업을 효율적으로 수행 할 수 있습니다.
데이터베이스에서 모든 노래를 찾으려면 다음 쿼리를 다시 실행 해 보겠습니다. SELECT * FROM songs SQL 유형 데이터베이스 (편집기가 마지막 쿼리를 기억하기 때문에 *New* 버튼을 눌러 편집기를 청소하십시오) −
FOR song IN songs
RETURN song
결과 세트에는 지금까지 저장된 노래 목록이 표시됩니다. songs 아래 스크린 샷에 표시된대로 수집.
같은 작업 FILTER, SORT 과 LIMIT 추가 할 수 있습니다 For loop 본문을 좁히고 결과를 정렬합니다.
FOR song IN songs
FILTER song.Year > 1940
RETURN song
위 쿼리는 결과 탭에서 1940 년 이후에 생성 된 노래를 제공합니다 (아래 이미지 참조).
이 예제에서는 문서 키가 사용되지만 다른 속성도 필터링에 해당하는 것으로 사용할 수 있습니다. 문서 키는 고유함이 보장되므로 하나의 문서 만이 필터와 일치합니다. 다른 속성의 경우 그렇지 않을 수 있습니다. 이름을 기준으로 오름차순으로 정렬 된 활성 사용자의 하위 집합 (상태라는 속성에 의해 결정됨)을 반환하려면 다음 구문을 사용합니다.
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
위 스크린 샷과 같이 하나의 문서가 작성되었음을 알 수 있습니다.
이제 다른 문서 (노래)도 업데이트하겠습니다.
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)
}
이번에는 길이와 함께 노래 제목을 반환합니다. 그만큼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
SQL과의 유사성을 강조하기 위해 AQL에 중첩 된 FOR 루프 쿼리를 제공하여 REPLACE 작업을 수행하고 내부 루프에서 먼저 모든 작곡가의 dob을 반복 한 다음 모든 관련 노래를 반복하여 다음을 포함하는 새 문서를 만듭니다. 속성 song_with_composer_key 대신 song 속성.
여기에 쿼리가 있습니다-
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
이제 쿼리를 실행하겠습니다. 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-loop 쿼리이지만 이번에는 Join 작업으로 이어지며 연관된 작곡가의 이름 (`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"
}
]