如何将项目添加到列表中? [英] How do i add items to a list?

查看:25
本文介绍了如何将项目添加到列表中?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想在我的用户表中的 listOfVideosRated[] 列表中添加一个字符串词.

I'd like to add a string word to the listOfVideosRated[] list in my Users table.

推荐答案

如果你能发布你的架构/解析器映射模板,我可以提供更具体的建议,但我会尽力用你发布的内容来回答这个问题到目前为止.

If you can post your schema / resolver mapping template I can offer more specific advice, but I'll do my best to answer this with what you've posted so far.

如果您已经拥有现有项目,一种方法是更新现有 Pairs 并将其传递给您现有的变更.

If you have the existing item already, one way to do this would be to update the existing Pairs and pass that to your existing mutation.

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)
}

使用 DynamoDB 函数

如果您没有现有的项目或者 Pairs 可能非常大,则可以使用 AWS DynamoDB 的 list_append 函数代替.

Using DynamoDB functions

If you do not have the existing item or if Pairs can be pretty big, AWS DynamoDB's list_append function can be used instead.

list_append(操作数,操作数)

list_append (operand, operand)

这个函数的计算结果是一个添加了新元素的列表.您可以通过反转操作数的顺序将新元素附加到列表的开头或结尾.

This function evaluates to a list with a new element added to it. You can append the new element to the start or the end of the list by reversing the order of the operands.

这是一个使用它的特定突变的示例.

Here is an example with a specific mutation that uses it.

### 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)

这种方式也很好,因为如果其他人更新 Pairs,您不会覆盖他们的更新.您还可以通过将参数的顺序反转到 list_append 函数,将新的 Pair 添加到列表的开头.

This way is also nice because if someone else updates Pairs, you won't overwrite their update. You can also add the new Pair to the beginning of the list by inverting the order of your arguments to the list_append function.

如果您的项目是由 AWS Amplify 生成的,您将需要添加 客户解析器.

If your project was generated by AWS Amplify, you will need to add a customer resolver.

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

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

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

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

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

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

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

第 5 步:构建和部署您的新更改

  • 运行 amplify api gql-compile 以查看生成的代码中的新更改(可选).
  • 运行 amplify push 以部署您的更改.
  • Step 5: Build and Deploy your new changes

    • Run amplify api gql-compile to see the new changes in your generated code (optional).
    • Run amplify push to deploy your changes.
    • 现在您可以运行 amplify api 控制台 或使用新生成的代码来测试您的新变异的更改.

      Now you can either run amplify api console or use the new generated code to test the changes with your new mutation.

      要生成新代码,您可以运行 amplify codegen.然后你应该能够做这样的事情

      To generate the new code you can run amplify codegen. You should then be able to do something like this

      import Amplify, { API, graphqlOperation } from "aws-amplify";
      import * as mutations from './graphql/mutations';
      
      // Mutation
      const addPairToItem = {
          id: '1',
          number1: 'a',
          number2: 'b'
      };
      
      const newItem = await API.graphql(graphqlOperation(mutations.addPairToItem, {input: addPairToItem}));
      

      其他示例

      记得使用您添加的任何新解析器更新您的 CustomResources.json 文件.

      Additional Examples

      Remember to update your CustomResources.json file with any new resolvers you add.

      ### ./amplify/backend/api/<api_name>/schema.graphql
      type Item @model {
          id: ID!
          words: [String]
      }
      
      input AddWordInput {
          id: ID!
          word: String!
      }
      
      type Mutation {
          addWordToItem(input: AddWordInput!): Item!
      }
      
      ### ./amplify/backend/api/<api_name>/resolvers/Mutation.addWordToItem.req.vtl
      {
          "version": "2017-02-28",
          "operation": "UpdateItem",
          "key": {
              "id": { "S": "$ctx.args.input.id"}
          },
          "update": {
              "expression":"SET words = list_append(if_not_exists(words, :emptyList), :newWord)",
              "expressionValues":
                {
                  ":newWord":{"L": [{"S":"$ctx.args.input.word"}]},
                  ":emptyList":{"L": []}
                }
              }
      }
      
      ### ./amplify/backend/api/<api_name>/resolvers/Mutation.addWordToItem.res.vtl
      $util.toJson($ctx.result)
      
      
      ### Usage
      import Amplify, { API, graphqlOperation } from "aws-amplify";
      import * as mutations from './graphql/mutations';
      
      // Mutation
      const newWord = {
          id: '1',
          word: 'foo'
      };
      
      const newItem = await API.graphql(graphqlOperation(mutations.addWordToItem, {input: newWord}));
      

      将多个项目添加到标量值列表

      注意:我在这里引入 $util.dynamodb.toDynamoDBJson 是为了更容易地构建我们的 VTL.到目前为止,我一直很明确,但这个实用程序可以简化很多工作.更多信息

      Adding multiple items to a list of scalar values

      Note: I am introducing $util.dynamodb.toDynamoDBJson here to make constructing our VTL easier. I've been explicit thus far but this utility can simplify a lot of the work. More here

      ### ./amplify/backend/api/<api_name>/schema.graphql
      type Item @model {
          id: ID!
          words: [String]
      }
      
      input AddWordsInput {
        id: ID!
        words: [String!]!
      }
      
      type Mutation {
        addWordsToItem(input: AddWordsInput!): Item!
      }
      
      ### ./amplify/backend/api/<api_name>/resolvers/Mutation.addWordsToItem.req.vtl
      {
          "version": "2017-02-28",
          "operation": "UpdateItem",
          "key": {
              "id": { "S": "$ctx.args.input.id"}
          },
          "update": {
              "expression":"SET words = list_append(if_not_exists(words, :emptyList), :newWords)",
              "expressionValues":
                {
                  ":newWords": $util.dynamodb.toDynamoDBJson($ctx.args.input.words),
                  ":emptyList": $util.dynamodb.toDynamoDBJson([])
                }
              }
      }
      
      ### ./amplify/backend/api/<api_name>/resolvers/Mutation.addWordsToItem.res.vtl
      $util.toJson($ctx.result)
      
      
      ### Usage
      import Amplify, { API, graphqlOperation } from "aws-amplify";
      import * as mutations from './graphql/mutations';
      
      // Mutation
      const newWords = {
          id: '1',
          words: ["bar","xyz","bar"]
      };
      
      const newItem = await API.graphql(graphqlOperation(mutations.addWordsToItem, {input: newWords}));
      

      从标量值列表中删除一项

      从 DynamoDB 的列表中删除元素是 使用 REMOVE 操作完成.您必须指定一个非负索引作为更新表达式的一部分.如果该项目上不存在索引,则您的请求不会失败(例如,没有索引越界异常).

      Remove an item from a list of scalar values

      Removing elements from lists in DynamoDB is done using the REMOVE action. You must specify a non-negative index as part of the update expression. If the index does not exist on the item, your request will not fail (e.g. no index out of bounds exceptions).

      type Item @model {
          id: ID!
          words: [String]
      }
      
      input RemoveWordInput {
        id: ID!
        wordIndex: Int!
      }
      
      type Mutation {
          removeWordFromItem(input: RemoveWordInput!): Item!
      }
      
      ### ./amplify/backend/api/<api_name>/resolvers/Mutation.removeWordFromItem.req.vtl
      {
          "version": "2017-02-28",
          "operation": "UpdateItem",
          "key": {
              "id": { "S": "$ctx.args.input.id"}
          },
          "update": {
              "expression":"REMOVE words[$ctx.args.input.wordIndex]"
          }
      }
      
      ### ./amplify/backend/api/<api_name>/resolvers/Mutation.removeWordFromItem.res.vtl
      $util.toJson($ctx.result)
      
      
      ### Usage
      import Amplify, { API, graphqlOperation } from "aws-amplify";
      import * as mutations from './graphql/mutations';
      
      // Mutation
      const removeWord = {
          id: '1',
          // The index is 0 based so wordIndex: 0
          // would delete the first item,
          // wordIndex: 1 deletes the second, etc.
          wordIndex: 1 
      };
      
      const newItem = await API.graphql(graphqlOperation(mutations.removeWordFromItem, {input: removeWord}));
      

      这篇关于如何将项目添加到列表中?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆