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

在Lambda Node.js中查询带GSI的DynamoDB表时语法报错,如何解决?

DynamoDB Lambda查询GSI时出现语法错误

我有一张DynamoDB表,带有全局二级索引(GSI)filteredurl-dateinseconds-index,分区键为filteredurl,排序键为dateinseconds。通过AWS控制台使用该索引查询时,能正常获取到filteredurl为指定值且dateinseconds > 1的条目,但在Lambda Node.js中执行相同查询时报错。

Lambda代码如下:

params = {
    TableName: TableName,
    IndexName: "filteredurl-dateinseconds-index",
    KeyConditionExpression: "filteredurl = :url and dateinseconds > 1",
    ExpressionAttributeValues: {":url": {"S": "somevalue"}},
    ProjectionExpression: "id"
};

var results = await ddb.query(params).promise();

收到的错误信息:

无效的KeyConditionExpression:语法错误;标记:"1",位置:"> 1"

错误追踪:

{
  "errorType": "ValidationException",
  "errorMessage": "Invalid KeyConditionExpression: Syntax error; token: \"1\", near: \"> 1\"",
  "trace": [
    "ValidationException: Invalid KeyConditionExpression: Syntax error; token: \"1\", near: \"> 1\"",
    "    at Request.extractError (/var/runtime/node_modules/aws-sdk/lib/protocol/json.js:52:27)",
    "    at Request.callListeners (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:106:20)",
    "    at Request.emit (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:78:10)",
    "    at Request.emit (/var/runtime/node_modules/aws-sdk/lib/request.js:686:14)",
    "    at Request.transition (/var/runtime/node_modules/aws-sdk/lib/request.js:22:10)",
    "    at AcceptorStateMachine.runTo (/var/runtime/node_modules/aws-sdk/lib/state_machine.js:14:12)",
    "    at /var/runtime/node_modules/aws-sdk/lib/state_machine.js:26:10)",
    "    at Request.<anonymous> (/var/runtime/node_modules/aws-sdk/lib/request.js:38:9)",
    "    at Request.<anonymous> (/var/runtime/node_modules/aws-sdk/lib/request.js:688:12)",
    "    at Request.callListeners (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:116:18)"
  ]
}

问题原因

DynamoDB SDK要求KeyConditionExpression中所有条件值必须通过ExpressionAttributeValues引用,不能直接写字面量(比如> 1里的1)。AWS控制台会自动处理字面量转换,但SDK严格遵循语法规则,因此触发报错。

修正后的代码

params = {
    TableName: TableName,
    IndexName: "filteredurl-dateinseconds-index",
    KeyConditionExpression: "filteredurl = :url and dateinseconds > :minDate",
    ExpressionAttributeValues: {
        ":url": {"S": "somevalue"},
        ":minDate": {"N": "1"} // 类型需与dateinseconds实际类型一致,字符串类型则用{"S": "1"}
    },
    ProjectionExpression: "id"
};

var results = await ddb.query(params).promise();

关键修改点

  • 将KeyConditionExpression中的1替换为占位符:minDate
  • 在ExpressionAttributeValues中添加:minDate的定义,确保数据类型与dateinseconds字段完全匹配

内容的提问来源于stack exchange,提问作者Thomas Carlton

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 02:05:18