DynamoDB에서 쿼리 작업 - Amazon DynamoDB

DynamoDB에서 쿼리 작업

Amazon DynamoDB에서 Query 작업은 기본 키 값을 기반으로 항목을 찾습니다.

파티션 키 속성의 이름과 해당 속성의 단일 값을 제공해야 합니다. Query는 해당 파티션 키 값을 갖는 모든 항목을 반환합니다. 선택에 따라 정렬 키 속성을 제공하고 비교 연산자를 사용하여 검색 결과의 범위를 좁힐 수 있습니다.

키 조건 표현식

검색 기준을 지정하려면 테이블 또는 인덱스에서 읽을 항목을 결정하는 문자열인 키 조건 표현식을 사용합니다.

파티션 키 이름 및 값은 등식 조건으로 지정해야 합니다.

정렬 키의 두 번째 조건(있는 경우)은 옵션으로 입력할 수 있습니다. 단, 정렬 키 조건은 다음 중 한 가지 비교 연산자를 사용해야 합니다.

  • a = b - 속성 a가 값 b와 같은 경우 true

  • a < b - ab보다 작은 경우 true

  • a <= b - ab보다 작거나 같은 경우 true

  • a > b - ab보다 큰 경우 true

  • a >= b - ab보다 크거나 같은 경우 true

  • a BETWEEN b AND c - ab보다 크거나 같고 c보다 작거나 같은 경우 true

다음 함수도 지원됩니다.

  • begins_with (a, substr) - a 속성 값이 특정 하위 문자열로 시작하는 경우 true

다음 AWS Command Line Interface(AWS CLI) 예제는 키 조건 표현식의 사용을 보여 줍니다. 이 표현식들은 실제 값이 아닌 자리 표시자(:name:sub)를 사용합니다. 자세한 내용은 DynamoDB의 표현식 속성 이름식 속성 값 단원을 참조하세요.

Thread 테이블에 대한 쿼리를 실행하여 특정 ForumName(파티션 키)을 찾습니다. 쿼리 결과에 따라 ForumName 값을 갖는 항목을 모두 읽어옵니다. 정렬 키(Subject)가 KeyConditionExpression에 추가되지 않았기 때문입니다.

aws dynamodb query \ --table-name Thread \ --key-condition-expression "ForumName = :name" \ --expression-attribute-values '{":name":{"S":"Amazon DynamoDB"}}'

Thread 테이블에 대한 쿼리를 실행하여 특정 ForumName(파티션 키)을 찾습니다. 하지만 이번에는 Subject(정렬 키)를 갖는 항목만 반환됩니다.

aws dynamodb query \ --table-name Thread \ --key-condition-expression "ForumName = :name and Subject = :sub" \ --expression-attribute-values file://values.json

--expression-attribute-values의 인수는 values.json 파일에 저장됩니다.

{ ":name":{"S":"Amazon DynamoDB"}, ":sub":{"S":"DynamoDB Thread 1"} }

Reply 테이블에 대해 쿼리를 실행하여 특정 Id(파티션 키)를 찾습니다. 하지만 ReplyDateTime(정렬 키)이 몇 가지 문자로 시작되는 항목만 반환됩니다.

aws dynamodb query \ --table-name Reply \ --key-condition-expression "Id = :id and begins_with(ReplyDateTime, :dt)" \ --expression-attribute-values file://values.json

--expression-attribute-values의 인수는 values.json 파일에 저장됩니다.

{ ":id":{"S":"Amazon DynamoDB#DynamoDB Thread 1"}, ":dt":{"S":"2015-09"} }

키 조건 표현식에서는 첫 번째 문자가 a-z 또는 A-Z이고, 두 번째 문자(있는 경우)가 a-z, A-Z 또는 0-9인 경우에 한해 속성 이름은 아무거나 사용할 수 있습니다. 또한 속성 이름이 DynamoDB 예약어가 되어서는 안 됩니다. (예약어 전체 목록은 DynamoDB의 예약어 단원을 참조하세요.) 속성 이름이 이러한 요건을 만족하지 않으면 표현식 속성 이름을 자리 표시자로 정의해야 합니다. 자세한 내용은 DynamoDB의 표현식 속성 이름 섹션을 참조하세요.

일정한 파티션 키 값을 갖는 항목들에 대해서는 DynamoDB가 정렬 키 값을 기준으로 순서를 정렬하여 모두 함께 저장합니다. Query 작업을 할 때는 DynamoDB는 정렬된 순서대로 항목을 가져온 다음 FilterExpression과 모든 KeyConditionExpression(있는 경우)을 사용해 항목을 처리합니다. 그러면 클라이언트에게는 Query 결과만 다시 보내집니다.

Query 작업은 항상 결과 집합을 반환합니다. 일치하는 항목이 없다면 결과 집합은 비어 있습니다.

Query 결과는 항상 정렬 키 값을 기준으로 정렬됩니다. 정렬 키의 데이터 형식이 Number이면 결과가 숫자 순서대로 반환됩니다. 그렇지 않으면 결과가 UTF-8 바이트 순서로 반환됩니다. 기본적으로 정렬 순서는 오름차순입니다. 오름차순을 역순으로 바꾸려면 ScanIndexForward 파라미터를 false로 설정하면 됩니다.

단일 Query 작업은 최대 1MB의 데이터를 가져올 수 있습니다. 이러한 크기 제한은 FilterExpression이 결과에 반영되기 전에 적용됩니다. 응답에 LastEvaluatedKey가 존재하고 null이 아니라면 결과 집합을 페이지 매김해야 합니다(테이블 쿼리 결과 페이지 매김 참조).

쿼리에 대한 필터 표현식

Query 결과를 한층 더 좁혀야 하는 경우 선택적으로 필터 표현식을 제공할 수 있습니다. 필터 표현식Query 결과 내에서 어떤 항목을 반환할지를 결정합니다. 다른 모든 결과는 폐기됩니다.

필터 표현식은 Query이 완료된 후 결과가 반환되기 전에 적용됩니다. 따라서 필터 표현식이 있는지 여부와 상관없이 Query은 동일한 양의 읽기 용량을 사용합니다.

Query 작업은 최대 1MB의 데이터를 가져올 수 있습니다. 이 제한은 필터 표현식이 평가되기 전에 적용됩니다.

필터 표현식에는 파티션 키 또는 정렬 키 속성이 포함될 수 없습니다. 필터 표현식이 아닌 키 조건 표현식에 있는 속성을 지정해야 합니다.

필터 표현식의 구분은 키 조건 표현식의 구문과 같습니다. 필터 표현식은 키 조건 표현식과 동일한 비교기, 함수 및 논리적 연산자를 사용할 수 있으며, 추가로 같지 않은 연산자(<>)도 사용할 수 있습니다. 자세한 내용은 키 조건 표현식 섹션을 참조하세요.

다음 AWS CLI 예제에서는 Thread 테이블에 대해 쿼리를 실행하여 특정 ForumName(파티션 키)과 Subject(정렬 키)를 찾아봅니다. 찾은 항목 중에서 가장 인기 있는 토론 스레드가 반환됩니다. 즉, 일정 수 이상의 Views가 있는 스레드만 반환됩니다.

aws dynamodb query \ --table-name Thread \ --key-condition-expression "ForumName = :fn and Subject = :sub" \ --filter-expression "#v >= :num" \ --expression-attribute-names '{"#v": "Views"}' \ --expression-attribute-values file://values.json

--expression-attribute-values의 인수는 values.json 파일에 저장됩니다.

{ ":fn":{"S":"Amazon DynamoDB"}, ":sub":{"S":"DynamoDB Thread 1"}, ":num":{"N":"3"} }

Views는 DynamoDB에서 예약어이므로(DynamoDB의 예약어 참조) 이 예제에서는 #v를 자리 표시자로 사용합니다. 자세한 내용은 DynamoDB의 표현식 속성 이름 섹션을 참조하세요.

참고

필터 표현식은 Query 결과 집합에서 항목을 제거합니다. 많은 수의 항목을 반환할 것으로 예상되지만 해당 항목 중 대부분을 폐기해야 하는 경우 가능하다면 Query를 사용하지 마세요.

결과 집합의 항목 수 제한

Query 작업을 사용하여 읽는 항목 수를 제한할 수 있습니다. 이렇게 하려면 Limit 파라미터를 원하는 최대 항목 수로 설정합니다.

예를 들어 Query 값이 Limit이고 필터 표현식이 없는 상태에서 테이블을 6한다고 가정합니다. Query 결과에는 테이블에서 요청의 키 조건 표현식과 일치하는 처음 6개의 항목이 포함됩니다.

이제 필터 표현식을 Query에 추가한다고 가정합니다. 이 경우 DynamoDB는 최대 6개의 항목을 읽은 다음 필터 표현식과 일치하는 항목만 반환합니다. DynamoDB에서 더 많은 항목을 계속 읽은 경우 필터 표현식과 일치하는 항목이 더 많더라도 최종 Query 결과에는 여섯 개 이하의 항목이 포함됩니다.

결과 내 항목 수 계산

Query 응답에는 기준과 일치하는 항목 외에도 다음 요소가 포함됩니다.

  • ScannedCount - 필터 표현식(있는 경우)을 적용하기 에 키 조건 표현식과 일치한 항목 수입니다.

  • Count - 필터 표현식(있는 경우)을 적용한 에 남아 있는 항목 수입니다.

참고

필터 표현식을 사용하지 않으면 ScannedCountCount는 동일한 값을 갖습니다.

Query 결과 집합의 크기가 1MB보다 크면 ScannedCountCount는 총 항목 수의 일부만 표시합니다. 모든 결과를 검색하려면 여러 Query 작업을 수행해야 합니다(테이블 쿼리 결과 페이지 매김 참조).

Query 응답에는 해당하는 특정 ScannedCount 요청에 따라 처리된 항목의 CountQuery가 포함됩니다. 모든 Query 요청의 총계를 얻으려면 ScannedCountCount의 누계를 계산할 수 있습니다.

쿼리에서 사용된 용량 단위

복합 기본 키(파티션 키 및 정렬 키)가 있는 경우 모든 테이블 또는 보조 인덱스를 Query할 수 있습니다. Query 작업은 다음과 같이 읽기 용량 단위를 사용합니다.

다음을 Query하는 경우... DynamoDB는 다음에서 읽기 용량 단위를 사용합니다...
테이블의 할당된 읽기 용량.
글로벌 보조 인덱스 인덱스의 할당된 읽기 용량.
로컬 보조 인덱스 기본 테이블의 프로비저닝된 읽기 용량.

기본적으로, Query 작업은 얼마나 많은 읽기 용량을 사용하는지에 대한 데이터를 반환하지 않습니다. 하지만 ReturnConsumedCapacity 요청에서 Query 파라미터를 지정하여 이 정보를 얻을 수 있습니다. 다음은 ReturnConsumedCapacity에 대한 유효한 설정입니다.

  • NONE - 사용된 용량 데이터가 반환되지 않습니다. (이 값이 기본값입니다.)

  • TOTAL - 사용된 읽기 용량 단위의 집계 수가 응답에 포함됩니다.

  • INDEXES - 액세스한 각 테이블 및 인덱스에 사용된 용량과 함께 사용된 읽기 용량 단위의 집계 수가 응답에 표시됩니다.

DynamoDB는 애플리케이션에 반환되는 데이터 양이 아닌 항목 크기를 기준으로 사용된 읽기 용량 단위의 수를 계산합니다. 이러한 이유로, 모든 속성을 요청하든(기본 동작) 또는 일부 속성만 요청하든(프로젝션 표현식 사용) 상관없이 사용된 용량 단위의 수는 동일합니다. 이 수는 필터 표현식을 사용하는지 여부와도 상관없이 동일합니다.

쿼리를 위한 읽기 일관성

기본적으로 Query 작업은 최종적 일관된 읽기를 수행합니다. 따라서 최근 완료된 Query 또는 PutItem 작업으로 인해 UpdateItem 결과에 변경 사항이 반영되지 않을 수 있습니다. 자세한 내용은 읽기 일관성 섹션을 참조하세요.

강력한 일관된 읽기가 필요한 경우 ConsistentRead 요청에서 true 매개 변수를 Query로 설정합니다.