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

AWS AppSync解析器FilterExpression语法错误求助

解决AWS AppSync解析器中DynamoDB FilterExpression的IN语法错误

咱们先直接定位问题:你遇到的ValidationException是因为DynamoDB对IN运算符的语法有严格要求——IN后面必须用括号包裹占位符或值列表,你原来的写法topicId IN :ids漏掉了括号,这是导致语法错误的直接原因。

另外还要确认表达式值的格式是否符合DynamoDB的类型要求,下面是修正后的完整解析器代码:

{ 
  "version" : "2017-02-28", 
  "operation" : "Query", 
  "query" : { 
    "expression": "studentId = :id", 
    "expressionValues" : { 
      ":id" : { "S": "$ctx.args.studentId" } 
    } 
  }, 
  "filter": { 
    "expression": "topicId IN (:ids)", 
    "expressionValues" : { 
      ":ids" : { "NS" : $ctx.args.topicIds } 
    } 
  }, 
  "index": "studentId-index" 
}

关键修改说明:

  • 修正IN运算符语法:把"expression": "topicId IN :ids"改为"expression": "topicId IN (:ids)",添加括号后符合DynamoDB的FilterExpression语法规范。
  • 验证NS类型值的合法性:确保$ctx.args.topicIds是数字字符串数组(比如["1", "2", "3"]),因为DynamoDB的NS类型要求元素必须是表示数字的字符串,不能是纯数字数组。如果你的入参是数字数组,需要在VTL中先转换为字符串数组,示例代码如下:
    #set($stringTopicIds = [])
    #foreach($id in $ctx.args.topicIds)
      #set($void = $stringTopicIds.add($id.toString()))
    #end
    
    之后把$stringTopicIds替换到expressionValues的NS字段中即可。

额外验证点:

  • 确认studentId-index是存在且正确配置的全局二级索引,索引的分区键确实是studentId。
  • 检查入参studentId和topicIds是否正确传递,没有空值或格式错误。

内容的提问来源于stack exchange,提问作者Naveen Vignesh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:19:10