The provided starting key is invalid
TL;DR — 你的 ExclusiveStartKey 不符合你正在分頁的對象的 key schema。它必須確切含有 DynamoDB 在 LastEvaluatedKey 中回傳的鍵屬性 — 完整的 primary key,加上當你查詢 GSI/LSI 時的索引鍵 — 名稱與型別相同。原封不動地傳回 LastEvaluatedKey;手工組裝它正是這出錯之處。
這是什麼意思
ValidationException: The provided starting key is invalidValidationException: Exclusive Start Key must have same size as table's key schemaExclusiveStartKey 告訴 Query/Scan 從哪裡繼續。DynamoDB 對照表格的 key schema — 或對索引查詢而言,LastEvaluatedKey 攜帶的索引加表格的組合鍵 — 驗證它。缺少屬性、多餘屬性、名稱錯誤或型別錯誤,都會在讀取任何資料前失敗。
為什麼會發生
- 只用 partition key 手工組建鍵 — 複合鍵表格的起始鍵需要 partition 與 sort key。
- 只用表格鍵分頁索引 — GSI/LSI 查詢上的
LastEvaluatedKey含有索引鍵屬性與表格的 primary key;它們全都必須傳回。 - 型別或名稱偏移 — 鍵被序列化(JSON、URL 參數、快取)並在
LastEvaluatedKey原為數字之處以"42"傳回,或以改名的欄位傳回。 - 跨查詢重用鍵 — 將某個表格/索引的
LastEvaluatedKey傳給對另一個的查詢,或在 key schema 假設改變後傳給同一個查詢。 - 包裝器注入預設值 — 一個填入它認為屬於鍵的屬性的 ODM,可能將起始鍵填充超過 schema 大小。
如何修正
原封不動地來回傳遞
LastEvaluatedKey:let ExclusiveStartKey; do { const page = await docClient.send( new QueryCommand({ TableName, KeyConditionExpression, ExpressionAttributeValues, ExclusiveStartKey }) ); items.push(...(page.Items ?? [])); ExclusiveStartKey = page.LastEvaluatedKey; // verbatim — no rebuild } while (ExclusiveStartKey);若它跨越請求邊界,無損地序列化它 — 當分頁游標送到瀏覽器再返回時,編碼整個
LastEvaluatedKey物件(例如其 JSON 的 base64),而非從項目欄位重建它,並保持數字型別為數字。索引分頁時包含每個鍵屬性 — 索引 partition/sort key 與 表格 partition/sort key,確切如回傳。
不要捏造起始點 — DynamoDB 分頁沒有 offset;若你需要「從 X 附近開始」,在
KeyConditionExpression中表達它(sk > :x),而非手工製作的ExclusiveStartKey。
檢視 LastEvaluatedKey 對你的表格或索引實際含有什麼,可省去猜測 — DynoTable 桌面應用程式分頁瀏覽查詢並顯示原始游標,而 DynamoDB Expression Builder 圍繞它組合查詢請求。
相關錯誤
- The provided key element does not match the schema —
GetItem/寫入鍵上的相同 schema 不符。 - Query key condition not supported
- 程式碼範例:Get all items in Node.js · in Python (boto3) — 正確完成的 LastEvaluatedKey 分頁迴圈。
- 學習:Pagination in DynamoDB
References
- Paginating table query results in DynamoDB — Amazon DynamoDB Developer Guide
- Query — Amazon DynamoDB API Reference
- Scan — Amazon DynamoDB API Reference
最後驗證於 2026-07-13,對照上方連結的 AWS 官方文件。