DynamoDB "Can Not Use Both Expression and Non-Expression Parameters": no se pueden utilizar parámetros de expresión y no expresión
TL;DR: su solicitud establece un parámetro heredado (KeyConditions, QueryFilter, ScanFilter, AttributesToGet, Expected, AttributeUpdates, ConditionalOperator) y su expresión equivalente (KeyConditionExpression, FilterExpression, ProjectionExpression, ConditionExpression, UpdateExpression) en la misma llamada. DynamoDB prohíbe mezclar las dos familias. Elimine el parámetro heredado y utilice únicamente expresiones.
Qué significa
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 tiene dos generaciones de parámetros. La familia legacy (KeyConditions, QueryFilter, ScanFilter, AttributesToGet, Expected, AttributeUpdates, ConditionalOperator) precede a las expresiones; la familia de expresión (KeyConditionExpression, FilterExpression, ProjectionExpression, ConditionExpression, UpdateExpression) la reemplazó. Una sola petición debe comprometerse con una familia — la developer guide es explícita en que DynamoDB "does not allow mixing legacy conditional parameters and expression parameters in a single call", incluso cuando cubren aspectos no relacionados.
Por qué ocurre
- Código a medio migrar — añadiste
KeyConditionExpressionpero dejaste un viejoKeyConditionsen el mismo objeto de parámetros. - Una colisión de proyección —
AttributesToGet(legacy) junto aProjectionExpression. - Una colisión de filtro —
ScanFilter/QueryFilterjunto aFilterExpression. - Una colisión de escritura —
Expected/AttributeUpdatesjunto aConditionExpression/UpdateExpression. - Una biblioteca helper que inyecta un valor por defecto legacy mientras tú estableces la forma de expresión.
Cómo solucionarlo
- Elimina el parámetro legacy. Conserva solo la forma de expresión:
KeyConditionExpressionsobreKeyConditions,FilterExpressionsobreScanFilter/QueryFilter,ProjectionExpressionsobreAttributesToGet,ConditionExpression/UpdateExpressionsobreExpected/AttributeUpdates. - Mueve los valores a placeholders — los valores inline legacy pasan a ser
ExpressionAttributeValues(:v) y los nombres reservados/complejos pasan a serExpressionAttributeNames(#n). - Audita el objeto de parámetros completo — el conflicto puede darse entre dos aspectos distintos (p. ej. proyección legacy + condición de clave de expresión), no solo el mismo.
- Prefiere las expresiones en todas partes — AWS mantiene los parámetros legacy solo por retrocompatibilidad y recomienda los parámetros de expresión para todo el código nuevo; estandarizar en expresiones evita esta clase de error.
- Quita los valores por defecto legacy de las bibliotecas helper. Algunos wrappers de SDK siguen inyectando
AttributesToGetoKeyConditionssalvo que los desactives explícitamente.
Ejecútalo en DynoTable
El panel de consultas de DynoTable usa solo parámetros de expresión — en las peticiones generadas no existe ningún campo legacy KeyConditions ni ScanFilter. Abre una tabla con ⌘K, construye una Query o un Scan y copia el KeyConditionExpression y los mapas de atributos emitidos a tu migración.
Usa el Query Builder para prototipar la petición solo-expresión antes de refactorizar código antiguo del SDK. El área de preparación (⌘S) te permite probar la nueva consulta contra datos reales sin confirmar escrituras. Cambia de perfil con ⌘P; configúralos en Settings → Profiles con Test Connection. Consulta Conectar con AWS e Instalación. Los parámetros legacy KeyConditions y ScanFilter no aparecen en ninguna petición generada por DynoTable. Si tu wrapper del SDK sigue inyectándolos, registra el objeto de parámetros completo y elimina cada clave legacy antes de que la llamada llegue a DynamoDB.
Fuentes
- Legacy DynamoDB conditional parameters (verificado 2026-07-13)
- Query — Amazon DynamoDB API Reference (verificado 2026-07-13)
Errores relacionados
- Cannot specify projection when Select is COUNT — otra combinación de parámetros mutuamente excluyentes.
- Query key condition not supported — un
KeyConditionExpressionmal formado. - Ejemplo de código: Query en Node.js — una Query solo-expresión a la que migrar.
- Aprende: Expresiones de condición de clave · Nombres y valores de expresión
Referencias
- 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
Verificado por última vez el 2026-07-13 contra la documentación oficial de AWS enlazada arriba.