DynamoDB查询时KeyConditionExpression中Number被识别为Map报错
问题根因
你使用AWS.DynamoDB.DocumentClient时沿用了原生DynamoDB客户端的参数格式,是本次报错的核心原因:
- 原生DynamoDB客户端要求所有属性值必须显式用类型结构体包裹,比如字符串用
{ S: "xxx" },数字用{ N: "数字转字符串后的结果" } - DocumentClient的核心能力就是自动完成TS/JS原生类型到DynamoDB类型的映射,无需手动加类型包裹。你手动加了
{ N: String(xxx) }结构后,DocumentClient会把整个结构识别为Map(对应DynamoDB的M类型),刚好匹配报错里的operand type: M提示。
修复代码
直接去掉ExpressionAttributeValues中的类型包裹即可:
const params: QueryInput = { TableName: criticalMessagesTableName, ProjectionExpression: 'message', KeyConditionExpression: 'myId = :myId and #ts BETWEEN :startTimestamp AND :endTimestamp', ExpressionAttributeValues: { ':myId': myId, ':startTimestamp': startTimestamp, ':endTimestamp': startTimestamp + range - 1, }, ExpressionAttributeNames: { '#ts': 'timestamp', }, };
补充说明
- DocumentClient默认类型映射规则:字符串自动映射为S类型,数字自动映射为N类型,布尔值自动映射为BOOL类型,普通对象自动映射为M类型,数组自动映射为L类型,不需要额外做类型转换,也不需要把数字手动转为字符串。
- 你原本的参数格式可以直接在
new AWS.DynamoDB()原生客户端实例下正常运行,仅和DocumentClient的传参规则不兼容。
内容的提问来源于stack exchange,提问作者carrybit
相关产品推荐
相关产品推荐

