Javascript 在向DynamoDB表添加项时,我应该使用put或update命令吗

Javascript 在向DynamoDB表添加项时,我应该使用put或update命令吗,javascript,python,typescript,amazon-web-services,amazon-dynamodb,Javascript,Python,Typescript,Amazon Web Services,Amazon Dynamodb,将年份作为主键,项目为: let item = { "year": 2021, "title": "Title A" } 我可以继续使用put方法将其添加到DynamoDB中: var AWS = require('aws-sdk'); AWS.config.update({region: "us-east-1"}); const docClient = new DynamoDB.Document

年份
作为主键,项目为:

let item = {

    "year": 2021,
    "title": "Title A"
}
我可以继续使用
put
方法将其添加到DynamoDB中:

var AWS = require('aws-sdk');
AWS.config.update({region: "us-east-1"});
const docClient = new DynamoDB.DocumentClient();

var params = {
  TableName: TABLE_NAME,
  Item: item,
  ConditionExpression: "year <> :year",
  ExpressionAttributeValues: {":year": 2021}
};
let promise = docClient.put(params).promise();
promise.then(res => {
  console.log("res:", res);
});
虽然这里的
put
update
命令都做得很好,但我更喜欢
update
命令,因为它允许我指定“ALL_NEW”作为
ReturnValues
参数的参数(对于
put
命令,“ALL_NEW”选项不可用)


使用
update
命令与使用
put
命令相比,性能是否有所下降?是否有任何理由让我使用
put
而不是
update

  • PutItem—将单个项写入表。如果表中存在具有相同主键的项,则该操作将替换该项。对于计算调配的吞吐量消耗,重要的项目大小是两者中较大的一个

  • UpdateItem-修改表中的单个项。DynamoDB考虑更新前后项目的大小。消耗的调配吞吐量反映了这些项目的较大规模。即使只更新项目属性的一个子集,UpdateItem仍将消耗所提供的全部吞吐量(项目大小“之前”和“之后”中的较大者)

以上引用自AWS官方文件(见参考资料)

然而,一切都取决于你在做什么:

将项目替换为DynamoDB中的整个条目。 更新只能更新单个属性。您还可以使用PUT更新属性

单属性更新==获取->修改代码中的单属性->将记录数据放入数据库

参考资料:
  • 所以话题:
  • 关于数据消耗的AWS文档:

没有性能差异,但在吞吐量方面存在差异

  • PutItem—将单个项写入表。如果表中存在具有相同主键的项,则该操作将替换该项。对于计算调配的吞吐量消耗,重要的项目大小是两者中较大的一个

  • UpdateItem-修改表中的单个项。DynamoDB考虑更新前后项目的大小。消耗的调配吞吐量反映了这些项目的较大规模。即使只更新项目属性的一个子集,UpdateItem仍将消耗所提供的全部吞吐量(项目大小“之前”和“之后”中的较大者)

以上引用自AWS官方文件(见参考资料)

然而,一切都取决于你在做什么:

将项目替换为DynamoDB中的整个条目。 更新只能更新单个属性。您还可以使用PUT更新属性

单属性更新==获取->修改代码中的单属性->将记录数据放入数据库

参考资料:
  • 所以话题:
  • 关于数据消耗的AWS文档:

    • 简而言之,在这种特殊情况下,没有区别


      当表中不存在项时,
      put
      update
      具有相同的行为。对于@Daniel Hornik提到的吞吐量差异,我不同意。在这种情况下,它们都使用相同的WCU。因此,如果对写入使用已配置的吞吐量,则可以预期相同的吞吐量水平。

      简而言之,在这种特殊情况下,没有区别


      当表中不存在项时,
      put
      update
      具有相同的行为。对于@Daniel Hornik提到的吞吐量差异,我不同意。在这种情况下,它们都使用相同的WCU。因此,如果对写入操作使用已设置的吞吐量,则可以期望相同级别的吞吐量。

      对我来说,主要区别在于可以添加一个条件表达式,这样就不会意外地覆盖已存在的密钥。例如:

      table.update_item(
              Key={
                  'ID': '1'
              },
              UpdateExpression='SET #a= :a, #b= :b',
              ConditionExpression='attribute_exists(ID)',
              ExpressionAttributeValues={
                  ':a': json.dumps(payload),
                  ':b': str(datetime.now())
              },
              ExpressionAttributeNames={
                  '#a': 'attribute1',
                  '#b': 'attribute2'
              },
              ReturnValues='ALL_NEW'
          )
      

      此示例仅在项目实际存在时执行更新。您可以将其更改为属性_not_exists(ID),以仅在该键不存在时插入。我觉得这样可以更好地控制何时/何时不将数据推送到表中。

      对我来说,主要区别在于可以添加一个条件表达式,这样就不会意外地覆盖已经存在的键。例如:

      table.update_item(
              Key={
                  'ID': '1'
              },
              UpdateExpression='SET #a= :a, #b= :b',
              ConditionExpression='attribute_exists(ID)',
              ExpressionAttributeValues={
                  ':a': json.dumps(payload),
                  ':b': str(datetime.now())
              },
              ExpressionAttributeNames={
                  '#a': 'attribute1',
                  '#b': 'attribute2'
              },
              ReturnValues='ALL_NEW'
          )
      

      此示例仅在项目实际存在时执行更新。您可以将其更改为属性_not_exists(ID),以仅在该键不存在时插入。我觉得这样可以更好地控制何时/何时不将数据推送到表中。

      相同的WCU仅适用于作者描述的这种特殊情况,当您覆盖项时存在差异。相同的WCU仅适用于作者描述的这种特殊情况,当您覆盖项时存在差异。