الآن بعد أن أصبح لديك CategoryIndex، يمكنك استخدامه لاسترداد كافة الكتب في فئة معينة. يشبه استخدام فهرس ثانوي للاستعلام عن جدول استخدام استدعاء واجهة برمجة تطبيقات Query. يمكنك الآن إضافة اسم الفهرس إلى استدعاء واجهة برمجة تطبيقات.
عند إضافة فهرس ثانوي عام إلى جدول موجود، يقوم DynamoDB بإعادة تعبئة الفهرس بشكل غير متزامن بالعناصر الموجودة في الجدول. الفهرس متاح للاستعلام بعد إعادة تعبئة جميع العناصر. يختلف الزمن المستغرق لإعادة التعبئة بناءً على حجم الجدول.
يمكنك استخدام البرنامج النصي query_with_index.py للاستعلام عن الفهرس الجديد. قم بتشغيل البرنامج النصي في وحدتك الطرفية باستخدام الأمر التالي.
$ python query_with_index.py
يقوم هذا الأمر بتشغيل البرنامج النصي التالي لاسترداد كافة الكتب الموجودة في المخزن والتي تحتوي على فئةالانتظار.
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'}
يعرض الاستعلام ثلاثة كتب لمؤلفين مختلفين. يُعد هذا نمط من أنماط الاستعلام التي يصعب تنفيذها مع المخطط الرئيسي لجدولك ولكن من السهل تنفيذها بقوة الفهارس الثانوية.
في الوحدة التالية، ستتعلم كيفية تحديث سمات عنصر موجود في جدول باستخدام واجهة برمجة التطبيقات UpdateItem.