Bây giờ bạn đã có CategoryIndex, bạn có thể sử dụng để truy xuất tất cả các sách trong một danh mục cụ thể. Việc sử dụng chỉ mục phụ để truy vấn bảng tương tự như sử dụng lệnh gọi API Query. Bây giờ bạn thêm tên chỉ mục vào lệnh gọi API.
Khi bạn thêm một chỉ mục phụ tổng thể vào bảng hiện có, DynamoDB sẽ lấp đầy chỉ mục một cách không đồng bộ với các mục hiện có trong bảng. Chỉ mục sẽ có thể truy vấn sau khi tất cả các mục đã được lấp đầy. Thời gian lấp đầy phù thuộc vào kích thước của bảng.
Bạn có thể sử dụng tập lệnh query_with_index.py để truy vấn chỉ mục mới. Chạy tập lệnh này với lệnh sau trong thiết bị đầu cuối của bạn.
$ python query_with_index.py
Lệnh đó sẽ chạy tập lệnh sau để truy xuất tất cả các cuốn sách trong cửa hàng có Category là 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)
Lưu ý rằng có một phần của tập lệnh chờ cho đến khi chỉ mục sẵn sàng cho phép truy vấn.
Bạn sẽ thấy kết quả đầu ra như sau trong thiết bị đầu cuối của mình.
$ 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'}
Truy vấn trả về ba cuốn sách của hai tác giả khác nhau. Đây là một mẫu hình truy vấn có thể khó khăn với lược đồ khóa chính của bảng nhưng đã dễ dàng được thực hiện nhờ các chỉ mục phụ.
Trong mô-đun tiếp theo, bạn sẽ tìm hiểu cách cập nhật các thuộc tính của một mục hiện có trong bảng bằng API UpdateItem.