CategoryIndex가 있으므로 이를 사용하여 특정 카테고리의 모든 서적을 검색할 수 있습니다. 보조 인덱스를 사용하여 테이블을 쿼리하는 방법은 Query API 호출을 사용하는 방법과 비슷합니다. 이제 API 호출에 인덱스 이름을 추가합니다.
기존 테이블에 글로벌 보조 인덱스를 추가하는 경우 DynamoDB에서는 테이블의 기존 항목으로 인덱스를 비동기식으로 다시 채웁니다. 모든 항목을 다시 채운 후 인덱스를 쿼리할 수 있습니다. 다시 채우는 데 걸리는 시간은 테이블 크기에 따라 다릅니다.
query_with_index.py 스크립트를 사용하여 새 인덱스를 쿼리할 수 있습니다. 터미널에서 다음 명령으로 스크립트를 실행합니다.
$ python query_with_index.py
이 명령은 다음 스크립트를 실행하여 매장에서 Category가 Suspense인 모든 서적을 검색합니다.
import time
import boto3
from boto3.dynamodb.conditions import Key
# Boto3 is the AWS SDK library for Python.
# The "resources" interface allows for a higher-level abstraction than the low-level client interface.
# For more details, go to http://boto3.readthedocs.io/en/latest/guide/resources.html
dynamodb = boto3.resource('dynamodb', region_name='us-east-1')
table = dynamodb.Table('Books')
# When adding a global secondary index to an existing table, you cannot query the index until it has been backfilled.
# This portion of the script waits until the index is in the “ACTIVE” status, indicating it is ready to be queried.
while True:
if not table.global_secondary_indexes or table.global_secondary_indexes[0]['IndexStatus'] != 'ACTIVE':
print('Waiting for index to backfill...')
time.sleep(5)
table.reload()
else:
break
# When making a Query call, you use the KeyConditionExpression parameter to specify the hash key on which you want to query.
# If you want to use a specific index, you also need to pass the IndexName in our API call.
resp = table.query(
# Add the name of the index you want to use in your query.
IndexName="CategoryIndex",
KeyConditionExpression=Key('Category').eq('Suspense'),
)
print("The query returned the following items:")
for item in resp['Items']:
print(item)
스크립트의 일부분은 인덱스를 쿼리할 수 있을 때까지 기다립니다.
터미널에 다음 출력이 표시됩니다.
$ python query_with_index.py
The query returned the following items:
{'Title': 'The Firm', 'Formats': {'Hardcover': 'Q7QWE3U2', 'Paperback': 'ZVZAYY4F', 'Audiobook': 'DJ9KS9NM'}, 'Author': 'John Grisham', 'Category': 'Suspense'}
{'Title': 'The Rainmaker', 'Formats': {'Hardcover': 'J4SUKVGU', 'Paperback': 'D7YF4FCX'}, 'Author': 'John Grisham', 'Category': 'Suspense'}
{'Title': 'Along Came a Spider', 'Formats': {'Hardcover': 'C9NR6RJ7', 'Paperback': '37JVGDZG', 'Audiobook': '6348WX3U'}, 'Author': 'James Patterson', 'Category': 'Suspense'}
쿼리는 작가 2명의 서적 3권을 반환합니다. 이 쿼리 패턴은 테이블의 기본 키 스키마에서 사용하기 어려워도, 뛰어난 보조 인덱스를 사용하면 쉽게 구현할 수 있습니다.
다음 모듈에서는 UpdateItem API를 사용하여 테이블에서 기존 항목의 속성을 업데이트하는 방법에 대해 알아봅니다.