本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
在 DynamoDB 中將資料表查詢結果分頁
DynamoDB 會對 Query 操作的結果進行分頁。透過編製分頁,Query 結果會分成數個大小為 1 MB (或更小) 的資料「頁」。應用程式可以處理結果的第一頁、第二頁,以此類推。
單一 Query 只會傳回符合 1 MB 大小限制的結果集。為判斷是否有更多結果,並且一次擷取一頁結果,應用程式應執行下列作業:
-
檢查低層級
Query結果:-
若結果包含
LastEvaluatedKey元素且為非空值,請接著進行步驟 2。 -
若結果中「沒有」
LastEvaluatedKey,就表示再也沒有要擷取的項目。
-
-
使用相同的
KeyConditionExpression建構Query。但這一次採用步驟 1 的LastEvaluatedKey值,並用它做為新Query要求的ExclusiveStartKey參數。 -
執行新的
Query請求。 -
前往步驟 1。
換句話說,LastEvaluatedKey 回應的 Query 應做為下一個 ExclusiveStartKey 請求的 Query 使用。若 LastEvaluatedKey 回應中沒有 Query 元素,表示您已擷取到結果的最終頁。如果 LastEvaluatedKey 不是空的,則不一定意味著結果集中有更多資料。檢查 LastEvaluatedKey 是否為空,是確定您是否已到達結果集末頁的唯一方式。
非空白LastEvaluatedKey僅表示先前的 Query停止於頁面界限 - 1 MB 頁面大小限制或Limit值 - 不一定會保留更多相符項目。特別是,當您使用 時FilterExpression, Query 會將 1 MB/Limit頁面上限套用至套用篩選條件之前讀取的項目,因此頁面可以傳回零相符項目,但仍包含 LastEvaluatedKey。繼續使用傳回的 發出請求,LastEvaluatedKey直到回應不再包含為止。
您可以使用 AWS CLI 檢視此行為。會重複 AWS CLI 傳送低階Query請求至 DynamoDB,直到結果LastEvaluatedKey中不再出現 為止。請考慮下列從特定年份擷取電影標題 AWS CLI 的範例。
aws dynamodb query --table-name Movies \ --projection-expression "title" \ --key-condition-expression "#y = :yyyy" \ --expression-attribute-names '{"#y":"year"}' \ --expression-attribute-values '{":yyyy":{"N":"1993"}}' \ --page-size 5 \ --debug
通常, 會自動 AWS CLI 處理分頁。不過,在此範例中, AWS CLI --page-size 參數會限制每頁的項目數。--debug 參數會列印請求及回應的下層資訊。
注意
自動分頁是 AWS CLI 版本 1 和版本 2 的預設行為,因此單一命令會傳回所有相符的項目。如果您改為需要自行分頁,請使用 --no-paginate選項來僅傳回第一頁 (回應接著包含剩餘LastEvaluatedKey更多項目),或使用 --max-items來限制傳回的項目數量,並取得擷取下一頁NextToken的值。
如果您執行此範例,DynamoDB 的第一個回應會類似以下內容。
2017-07-07 11:13:15,603 - MainThread - botocore.parsers - DEBUG - Response body: b'{"Count":5,"Items":[{"title":{"S":"A Bronx Tale"}}, {"title":{"S":"A Perfect World"}},{"title":{"S":"Addams Family Values"}}, {"title":{"S":"Alive"}},{"title":{"S":"Benny & Joon"}}], "LastEvaluatedKey":{"year":{"N":"1993"},"title":{"S":"Benny & Joon"}}, "ScannedCount":5}'
回應中的 LastEvaluatedKey 會指出並未擷取所有項目。 AWS CLI 然後, 向 DynamoDB 發出另一個Query請求。此請求和回應模式會持續到最終回應出現為止。
2017-07-07 11:13:16,291 - MainThread - botocore.parsers - DEBUG - Response body: b'{"Count":1,"Items":[{"title":{"S":"What\'s Eating Gilbert Grape"}}],"ScannedCount":1}'
若沒有 LastEvaluatedKey,就表示已不再有要擷取的項目。
注意
AWS SDKs 會處理低階 DynamoDB 回應 (包括是否存在 LastEvaluatedKey),並提供用於分頁Query結果的各種抽象概念。例如,適用於 Java 的開發套件文件介面會提供 java.util.Iterator 支援,讓您可一次處理一個結果。
如需各種程式設計語言的程式碼範例,請參閱《Amazon DynamoDB 入門指南》和所需語言的 AWS 軟體開發套件文件。
您還可以透過限制結果集的項目數 (使用 Query 操作的 Limit 參數) 來減少頁面大小。
如需使用 DynamoDB 進行查詢的詳細資訊,請參閱 在 DynamoDB 中查詢資料表。