You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 16:12:01