对于DynamoDB表中的“ id”(例如e5eb02ae-04d5-4331-91e6-11efaaf12ea5
),我想创建一个名为Pairs的列。在那对列中,我将拥有
['a', 'b'],
['c', 'd'],
['e', 'f'],
etc....
如果有新的配对,例如['g','h'],还需要更新配对。现在,我下面的update()每次都会替换成对。
const newPairs = {
number1: "g",
number2: "h"
}
const updateinfo = {
id: "e5eb02ae-04d5-4331-91e6-11efaaf12ea5",
Pairs: newPairs
}
try {
await API.graphql(graphqlOperation (UpdateInfo, { input: updateinfo })) //mutation
console.log('success')
}
catch (err) {
console.log(err)
}
如何做到这一点,以确保我的列表刚刚被添加到新对中,而不是被[g,h]完全取代?
答案 0 :(得分:2)
如果您可以发布架构/解析器映射模板,我可以提供更具体的建议,但我会尽力回答您到目前为止发布的内容。
如果您已经有了现有商品,一种方法是更新现有对,并将其传递给您现有的变异。
var divResult = document.getElementById('divResult');
console.log("divResult: " + divResult);
如果您没有现有项目,或者const existingItem = {
id: "e5eb02ae-04d5-4331-91e6-11efaaf12ea5",
Pairs: [['a', 'b'],['c', 'd'],['e', 'f']]
}
const newPairs = {
number1: "g",
number2: "h"
}
const updateinfo = {
id: existingItem.id,
// Note that if existingItem.Pairs is always defined this can be simplified to
// Pairs: [...existingItem.Pairs, [newPairs.number1, newPairs.number2]]
Pairs: existingItem.Pairs ?
[...existingItem.Pairs, [newPairs.number1, newPairs.number2]] :
[[newPairs.number1, newPairs.number2]]
}
try {
await API.graphql(graphqlOperation (UpdateInfo, { input: updateinfo }))
//mutation
console.log('success')
}
catch (err) {
console.log(err)
}
可能很大,则可以使用AWS DynamoDB的Pairs
函数。
list_append(操作数,操作数)
此函数求值为列表,其中添加了新元素。您可以通过反转操作数的顺序将新元素追加到列表的开头或结尾。
这是一个使用它的特定突变的例子。
list_append
这种方式也很好,因为如果其他人更新了配对,则您不会覆盖他们的更新。您还可以通过将参数的顺序反转到### SDL
type Item {
id: ID!
Pairs: [[String]]
}
input AddPairInput {
id: ID!
number1: String!
number2: String!
}
type Mutation {
addPairToItem(input: AddPairInput!): Item!
}
...rest of schema omitted for brevity
### Resolver Request Mapping Template
{
"version": "2017-02-28",
"operation": "UpdateItem",
"key": {
"id": { "S": "$ctx.args.input.id"}
},
"update": {
### Note: we also use if_not_exists here so this works if Pairs is not yet defined on the item.
"expression":"SET Pairs = list_append(if_not_exists(Pairs, :emptyList), :newPair)",
"expressionValues":
{
":newPair":{"L": [{"L":[{"S":"$ctx.args.input.number1"},
{"S":"$ctx.args.input.number2"}]}]},
":emptyList":{"L": []}
}
}
}
### Resolver Response Mapping Template
$util.toJson($ctx.result)
函数来将新的Pair添加到列表的开头。
如果您的项目是由AWS Amplify生成的,则需要添加a customer resolver。
list_append
### ./amplify/backend/api/<api_name>/schema.graphql
type Item @model {
id: ID!
Pairs: [[String]]
}
type Mutation {
addPairToItem(input: AddPairToItemInput!): Item!
}
input AddPairToItemInput {
id: ID!
number1: String!
number2: String!
}
### ./amplify/backend/api/<api_name>/resolvers/Mutation.addPairToItem.req.vtl
{
"version": "2017-02-28",
"operation": "UpdateItem",
"key": {
"id": { "S": "$ctx.args.input.id"}
},
"update": {
"expression":"SET Pairs = list_append(if_not_exists(Pairs, :emptyList), :newPair)",
"expressionValues":
{
":newPair":{"L": [{"L":[{"S":"$ctx.args.input.number1"},{"S":"$ctx.args.input.number2"}]}]},
":emptyList":{"L": []}
}
}
}
### ./amplify/backend/api/<api_name>/resolvers/Mutation.addPairToItem.res.vtl
$util.toJson($ctx.result)
### ./amplify/backend/api/<api_name>/stacks/CustomResources.json
"Resources": {
// ...other resources may exist here
"AddPairToItemResolver": {
"Type": "AWS::AppSync::Resolver",
"Properties": {
"ApiId": {
"Ref": "AppSyncApiId"
},
"DataSourceName": "ItemTable",
"TypeName": "Mutation",
"FieldName": "addPairToItem",
"RequestMappingTemplateS3Location": {
"Fn::Sub": [
"s3://${S3DeploymentBucket}/${S3DeploymentRootKey}/resolvers/Mutation.addPairToItem.req.vtl",
{
"S3DeploymentBucket": {
"Ref": "S3DeploymentBucket"
},
"S3DeploymentRootKey": {
"Ref": "S3DeploymentRootKey"
}
}
]
},
"ResponseMappingTemplateS3Location": {
"Fn::Sub": [
"s3://${S3DeploymentBucket}/${S3DeploymentRootKey}/resolvers/Mutation.addPairToItem.res.vtl",
{
"S3DeploymentBucket": {
"Ref": "S3DeploymentBucket"
},
"S3DeploymentRootKey": {
"Ref": "S3DeploymentRootKey"
}
}
]
}
}
}
},
以查看生成的代码中的新更改(可选)。amplify api gql-compile
来部署您的更改。现在,您可以运行amplify push
或使用新生成的代码来测试具有新突变的更改。
要生成新代码,可以运行amplify api console
。然后,您应该可以执行类似的操作
amplify codegen