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

AppSync/GraphQL嵌套对象过滤问题:DynamoDB列表子项筛选失败

解决DynamoDB嵌套列表过滤的Resolver问题

问题根源

你当前的Resolver逻辑存在两个关键问题:

  1. FilterExpression逻辑错误:DynamoDB中addresses.isCurrent = :isActiveByUser这种写法,是要求该item的addresses列表里所有嵌套对象的isCurrent都等于指定值时,才会返回整个item。而你的需求是保留列表中符合条件的元素,不是过滤整个item。
  2. 不必要的Query操作:site是你的主键,直接用GetItem操作获取对应数据比Query更高效,不需要额外的查询条件。

正确解决方案

统一使用GetItem获取完整的site数据,然后在Resolver中对addresses列表进行过滤,只保留符合isCurrent条件的元素。

修改后的Resolver代码

{
    "version": "2017-02-28",
    "operation": "GetItem",
    "key": {
        "site": $util.dynamodb.toDynamoDBJson($ctx.args.site)
    }
}
#if($ctx.args.isCurrent != null && $ctx.args.isCurrent)
    #set($item = $util.transform.toDynamoDBItemJson($ctx.result))
    #set($filteredAddresses = [])
    #foreach($addr in $item.addresses)
        #if($addr.isCurrent == true)
            #set($void = $filteredAddresses.add($addr))
        #end
    #end
    $util.qr($item.put("addresses", $filteredAddresses))
    $util.toJson($item)
#else
    $util.toJson($util.transform.toDynamoDBItemJson($ctx.result))
#end

代码解释

  1. 获取数据:始终用GetItem根据site主键获取完整的item数据,保证效率和准确性。
  2. 过滤列表:当isCurrent参数为true时,遍历addresses列表,只将isCurrent为true的地址保留到新列表中。
  3. 返回结果:将过滤后的列表替换原item中的addresses,再返回处理后的JSON数据;如果isCurrent未传或为false,直接返回原始数据。

额外说明

  • 如果你坚持要用Query操作(不推荐,因为主键查询用GetItem更优),也需要在Resolver中处理列表过滤,而不是依赖DynamoDB的FilterExpression,因为FilterExpression无法实现列表元素的筛选,只能过滤整个item。
  • 确保DynamoDB表中site是主键(Partition Key),这样GetItem才能正确定位到数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 07:15:56