如何为给定的DynamoDB行创建数组对?

时间:2019-07-17 22:13:45

标签: javascript database amazon-dynamodb graphql aws-appsync

对于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]完全取代?

1 个答案:

答案 0 :(得分:2)

如果您可以发布架构/解析器映射模板,我可以提供更具体的建议,但我会尽力回答您到目前为止发布的内容。

简单方法

如果您已经有了现有商品,一种方法是更新现有对,并将其传递给您现有的变异。

var divResult = document.getElementById('divResult');
console.log("divResult: " + divResult);

使用DynamoDB函数

如果您没有现有项目,或者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的DynamoDB功能

如果您的项目是由AWS Amplify生成的,则需要添加a customer resolver

第1步:向您的架构添加新的变异

list_append

步骤2:添加解析器请求映射模板

### ./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!
}

步骤3:添加解析器响应映射模板

### ./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": []}
          }
        }
}

第4步:将自定义解析器添加到CustomResources堆栈中

### ./amplify/backend/api/<api_name>/resolvers/Mutation.addPairToItem.res.vtl
$util.toJson($ctx.result)

步骤5:构建和部署新更改

  • 运行### ./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