【问题标题】:Is there an easier way to convert javascript object to dynamodb update expression?有没有更简单的方法将 javascript 对象转换为 dynamodb 更新表达式?
【发布时间】:2021-01-25 08:26:53
【问题描述】:

我正在使用带有 dynamodb 的 nodejs aws-sdk/clients/dynamodb 库。我需要更新表中的项目。以下是更新项目的示例代码:

params = {
    TableName:table,
    Key:{
        "year": year,
        "title": title
    },
    UpdateExpression: "set info.rating = info.rating + :val",
    ExpressionAttributeValues:{
        ":val": 1
    },
    ReturnValues:"UPDATED_NEW"
};

我必须在UpdateExpression 中指定info 中的每个属性。我的info 对象非常大,我正在寻找一种更简单的方法来做到这一点。是否有内置方法支持将对象更新为 dynamodb 项?类似:

params = {
    TableName:table,
    Key:{
        "year": year,
        "title": title
    },
    Item: info
};

【问题讨论】:

    标签: node.js amazon-web-services amazon-dynamodb


    【解决方案1】:

    E.J.给出的答案。 Brennan 非常适合替换整个项目的情况。 DocumentClient 减轻了处理 DynamoDB 属性类型的麻烦,但给出的示例使用了put 方法。根据文档put 传递给putItem,其中

    创建新项目,或用新项目替换旧项目

    这意味着它无助于对您还没有完整记录的现有项目进行部分更新(并且可以完全替换)。对于部分更新,您必须使用 updateItem,或者它的 DocumentClient 对应项,update。

    AWS 实验室有 published a utility 来帮助构建更新表达式以与 updateItem 一起使用。由于我通常更喜欢使用 DocumentClient,因此我使用 DynamoDB 的 Converter 提供的实用程序函数解组值(是的,我知道这有点来回,但它使测试更容易)。

    const AWS = require('aws-sdk');
    const db = new AWS.DynamoDB.DocumentClient();
    const { UpdateExpression, ExpressionAttributes } = require('@aws/dynamodb-expressions');
    const { unmarshall } = AWS.DynamoDB.Converter;
    
    const updateExpressionProps = ({ category, classification }) => {
      attributes = new ExpressionAttributes();
      expression = new UpdateExpression();
    
      expression.set('category', category);
      expression.set('classification', classification);
    
      return {
        UpdateExpression: expression.serialize(attributes),
        ExpressionAttributeNames: attributes.names,
        ExpressionAttributeValues: unmarshall(attributes.values),
      };
    };
    
    const updateRequest = async ({ id, subject, category, classification }) =>
      await db
        .update({
          TableName: 'table-name',
          Key: {
            id,
            subject,
          },
          ...updateExpressionProps({ category, classification }),
        })
        .promise();
    

    这段代码只更新了id和subject标识的记录上的category和classification属性,而无需手动构建正确的UpdateExpression字符串。这个例子可以很容易地推广到整个项目中可重用的东西。

    【讨论】:

      【解决方案2】:

      您可以使用文档客户端:

      适用于 JavaScript 的 AWS 开发工具包 2.2.0 版引入了对 在 AWS.DynamoDB 命名空间中记录客户端抽象。这 文档客户端抽象使得读取和写入数据更容易 带有适用于 JavaScript 的 AWS 开发工具包的 Amazon DynamoDB。现在你可以使用 本机 JavaScript 对象,无需将它们注释为 AttributeValue 类型。

      例如:

      var docClient = new AWS.DynamoDB.DocumentClient({region: 'us-west-2'});
      
      var params = {
          Item: {
              hashkey: 'key',
              boolAttr: true,
              listAttr: [1, 'baz', true]
              mapAttr: {
                  foo: 'bar'
              }
          },
          TableName: 'table'
      };
      
      docClient.put(params, function(err, data){
          if (err) console.log(err);
          else console.log(data);
      });
      

      https://aws.amazon.com/blogs/developer/announcing-the-amazon-dynamodb-document-client-in-the-aws-sdk-for-javascript/

      【讨论】:

      • 是否支持部分更新?它似乎用新的覆盖了整个项目?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      • 2019-11-16
      • 2023-03-14
      • 2020-03-19
      • 2022-07-08
      • 2021-03-24
      相关资源
      最近更新 更多