AWS SDK JavaScript v3 / ¿Cómo usar ExpressionAttributeNames dentro del comando Scan de dynamoDB?
Estoy utilizando una función Lambda que me obtiene el correo electrónico del usuario a partir de un ID de usuario dentro de una tabla dynamoDB. Uso el comando scan de dynamoDB para escanear todos los elementos dentro de la tabla dynamoDB. Utilizo el nuevo SDK de AWS JS v3.
Pregunta: ¿Por qué ExpressionAttributeNames no funciona correctamente en mi caso?
Esto funciona:
const params = {
FilterExpression: "user_info.user_id = :userid",
ExpressionAttributeValues: {
":userid": { S: user_id }
},
ProjectionExpression: "user_email",
TableName: aws_table,
}
Pero esto NO funciona, ¿por qué?
const params = {
FilterExpression: "#xyz = :userid",
ExpressionAttributeNames: {
"#xyz": "user_info.user_id" // <- el filtro no funciona así (devuelve 0 resultados)
},
ExpressionAttributeValues: {
":userid": { S: user_id }
},
ProjectionExpression: "user_email",
TableName: aws_table,
};
Mi código de operación de escaneo Lambda se ve así:
const { DynamoDBClient } = require("@aws-sdk/client-dynamodb");
const { ScanCommand } = require("@aws-sdk/client-dynamodb");
const ddbClient = new DynamoDBClient({ region: aws_region });
...
const run = async () => {
try {
const data = await ddbClient.send(new ScanCommand(params));
data.Items.forEach(function (element, index, array) {
console.log(element);
});
return data;
} catch (err) {
console.log("Error", err);
}
}
await run();
npm i @aws-sdk/client-dynamodb
Documentación:
https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/clients/client-dynamodb/interfaces/scancommandinput.html#expressionattributenames
davy.ai
El problema con
ExpressionAttributeNames
no funciona correctamente en tu caso se debe a una incompatibilidad en la sintaxis utilizada.ExpressionAttributeNames
se utiliza para definir marcadores de posición para los nombres de atributos en unaFilterExpression
oProjectionExpression
. Sin embargo, en tu ejemplo, estás intentando pasar toda la ruta del atributo como un marcador de posición, lo cual no es compatible.Para solucionar el problema, debes definir solo el nombre del atributo como marcador de posición en
ExpressionAttributeNames
, así:De esta manera, el marcador de posición
#xyz
se reemplazará por el nombre real del atributonombre_del_usuario
, y tuFilterExpression
funcionará como se espera.Además, ten en cuenta que es mejor utilizar
ExpressionAttributeValues
para definir marcadores de posición para los valores de atributos, ya que proporciona una mejor seguridad y evita posibles errores con los tipos de datos.