AWS Amplify GraphQL AppSync中如何实现数组替换而非追加?
AWS AppSync数组字段更新追加而非替换问题解决方案
根因
AWS AppSync自动生成的DynamoDB请求Resolver中,对数组类型字段的更新默认使用list_append操作,因此传入的新数组会被拼接在原有数组尾部,无法实现覆盖效果。
解决方法
方法1:修改Resolver模板(永久生效,推荐)
- 打开AWS AppSync控制台,进入你的API对应的「Schema」页面
- 在右侧「Resolver」列表中找到
updateFrameMutation对应的Resolver,点击进入编辑页面 - 修改「请求映射模板」中的更新表达式逻辑:
找到原有数组更新相关的代码段:
将#set( $expNames.$myArrayField = "myArray" ) #set( $expValues.$myArrayVal = $util.dynamodb.toDynamoDB($ctx.args.input.myArray) ) #set( $updateExpressions.add("SET #$myArrayField = list_append(#$myArrayField, $myArrayVal)") )list_append相关的逻辑改为直接赋值:#set( $expNames.$myArrayField = "myArray" ) #set( $expValues.$myArrayVal = $util.dynamodb.toDynamoDB($ctx.args.input.myArray) ) #set( $updateExpressions.add("SET #$myArrayField = $myArrayVal") ) - 保存Resolver即可,后续所有
updateFrame操作传入的myArray值都会直接覆盖原有数组。
方法2:带版本号调用Mutation(无需修改配置,临时使用)
Amplify生成的API默认开启了版本冲突检测,你只需要先查询获取目标记录的_version字段值,再在更新请求中携带该字段即可实现覆盖:
# 先执行查询拿到当前记录的_version值,示例中当前版本为2 mutation UpdateFrame { updateFrame(input: { id: "94cf1635-a336-4619-99eb-53c081f57bea", myArray: ["new value"], _version: 2 }) { id myArray _version } }
如果是使用Amplify JS SDK调用,示例代码如下:
import { API, graphqlOperation } from 'aws-amplify' import { getFrame, updateFrame } from './graphql/queries' // 先查询获取当前版本 const queryRes = await API.graphql(graphqlOperation(getFrame, { id: "94cf1635-a336-4619-99eb-53c081f57bea" })) const currentVersion = queryRes.data.getFrame._version // 执行更新 await API.graphql(graphqlOperation(updateFrame, { input: { id: "94cf1635-a336-4619-99eb-53c081f57bea", myArray: ["new value"], _version: currentVersion } }))
内容的提问来源于stack exchange,提问作者BitFunny
相关产品推荐
相关产品推荐

