Setelah memiliki CategoryIndex, Anda bisa menggunakannya untuk mengambil semua buku dengan kategori tertentu. Menggunakan indeks sekunder untuk query tabel hampir sama dengan menggunakan panggilan API Query. Sekarang Anda tambahkan nama indeks pada panggilan API.
Saat Anda menambahkan indeks sekunder global pada tabel yang ada, DynamoDB secara asinkron mengisi balik indeks dengan item-item yang ada dalam tabel. Indeks akan siap untuk query setelah semua item diisikan kembali. Waktu pengisian balik bervariasi sesuai ukuran tabel.
Anda bisa gunakan skrip query_with_index.py untuk query terhadap indeks baru. Jalankan skrip di terminal Anda dengan perintah berikut.
$ python query_with_index.py
Perintah ini menjalankan skrip berikut untuk mengambil semua buku di toko dengan 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)
Perhatikan bahwa ada sebagian skrip yang menunggu hingga indeks siap untuk query.
Anda akan melihat output berikut di terminal Anda.
$ 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'}
Query mengembalikan tiga buku karya dua penulis berbeda. Ini adalah pola query yang sedianya akan sulit dengan skema primary key tabel Anda tetapi mudah diimplementasikan dengan kekuatan indeks sekunder.
Pada modul berikutnya, Anda akan belajar cara memperbarui atribut item yang ada di suatu tabel dengan menggunakan API UpdateItem.