DynamoDB — can not use both expression and non-expression parameters
TL;DR — 你的請求在同一次呼叫中同時設定了一箇舊引數(KeyConditions、QueryFilter、ScanFilter、AttributesToGet、Expected、AttributeUpdates、ConditionalOperator)和它的運算式等價物(KeyConditionExpression、FilterExpression、ProjectionExpression、ConditionExpression、UpdateExpression)。DynamoDB 禁止混用這兩個族。移除舊引數,只用運算式。
這是什麼意思
ValidationException: Can not use both expression and non-expression parameters in
the same request: Non-expression parameters: {KeyConditions} Expression
parameters: {KeyConditionExpression}
# what the engine actually returns, reproduced against DynamoDB Local:
ValidationException: Can not use both expression and non-expression parameters in the same request: Non-expression parameters: {KeyConditions} Expression parameters: {KeyConditionExpression}DynamoDB 有兩代引數。舊族(KeyConditions、QueryFilter、ScanFilter、AttributesToGet、Expected、AttributeUpdates、ConditionalOperator)早於運算式;運算式族(KeyConditionExpression、FilterExpression、ProjectionExpression、ConditionExpression、UpdateExpression)取而代之。單個請求必須承諾使用其中一個族——開發者指南明確指出,DynamoDB"不允許在單次呼叫中混用舊的條件引數和運算式引數",即便它們覆蓋的是互不相關的方面。
為什麼會發生
- 遷移了一半的程式碼——你新增了
KeyConditionExpression,卻在同一個引數物件上留下了一箇舊的KeyConditions。 - 投影衝突——
AttributesToGet(舊)與ProjectionExpression並存。 - 過濾衝突——
ScanFilter/QueryFilter與FilterExpression並存。 - 寫入衝突——
Expected/AttributeUpdates與ConditionExpression/UpdateExpression並存。 - 某個輔助庫在你設定運算式形式時注入了一箇舊的預設值。
如何修正
- 刪除舊引數。 只保留運算式形式:用
KeyConditionExpression取代KeyConditions,FilterExpression取代ScanFilter/QueryFilter,ProjectionExpression取代AttributesToGet,ConditionExpression/UpdateExpression取代Expected/AttributeUpdates。 - 把值移入預留位置——舊的內聯值變為
ExpressionAttributeValues(:v),而保留字/複雜名稱變為ExpressionAttributeNames(#n)。 - 審計整個引數物件——衝突可能發生在兩個_不同_的方面之間(例如舊的投影 + 運算式鍵條件),而不只是同一方面。
- 處處優先使用運算式——AWS 僅出於向後相容而保留舊引數,並推薦所有新程式碼使用運算式引數;統一到運算式可以避免這類錯誤。
在現代化舊的查詢程式碼?先在 DynoTable 桌面應用裡把僅用運算式的請求原型化,然後把生成的引數複製到你的應用中。
在 DynoTable 中執行
DynoTable 的查詢面板僅使用運算式引數 - 生成的請求中不存在舊的 KeyConditions 或 ScanFilter 欄位。使用 ⌘K 開啟表,構建 Query 或 Scan,然後將發出的 KeyConditionExpression 和屬性對映覆制到遷移中。在重構舊的 SDK 程式碼之前,使用 Query Builder 構建僅運算式請求的原型。暫存 (⌘S) 允許你針對實時資料測試新查詢,而無需提交寫入。使用 ⌘P 切換設定檔案;在“設定”→“設定檔案”下使用“Test Connection”配置它們。參見連線 AWS和安裝。舊版 KeyConditions 和 ScanFilter 引數不會出現在 DynoTable 生成的請求中的任何位置。如果你的 SDK 包裝器仍然注入它們,請記錄完整的 params 物件並在呼叫到達 DynamoDB 之前刪除每個舊金鑰。
來源
- Legacy DynamoDB conditional parameters(2026-07-13 驗證)
- Query — Amazon DynamoDB API Reference(2026-07-13 驗證)
相關錯誤
- Cannot specify projection when Select is COUNT——另一種互斥的引數組合。
- Query key condition not supported——格式錯誤的
KeyConditionExpression。 - 程式碼示例:Query in Node.js——一個可遷移過去的僅用運算式的 Query。
- 學習:Key condition expressions · Expression names & values
參考資料
- Legacy DynamoDB conditional parameters — Amazon DynamoDB Developer Guide
- Query — Amazon DynamoDB API Reference
- PutItem — Amazon DynamoDB API Reference
- Using expressions in DynamoDB — Amazon DynamoDB Developer Guide
最後核實於 2026-07-13,依據上方連結的 AWS 官方文件。