提问者:小点点

在向DynamoDB表添加项目时是否应该使用put或update命令


使用作为主键,并且项目是:

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

请注意,我在这里使用条件表达式来确保表中不存在具有相同主键2021的项目。如果该项目存在,我将得到错误。否则,将添加该项目并返回空字典。

我可以使用update命令获得相同的功能,而不是使用put方法,例如:

let params = {
  TableName: TABLE_NAME,
  Key: {"year": year},
  UpdateExpression: "SET year=:year",
  ExpressionAttributeValues: {":year": year},
  ConditionExpression: "year <> :year"
};  
let promise = docClient.update(params).promise();
promise.then(res => {
  console.log("res:", res);
});

虽然putupdate命令在这里都做得很好,但我更喜欢update命令,因为它允许我指定ALL_NEW作为返回值参数的参数(对于put命令,选项ALL_NEW不可用)。

使用update命令与put命令相比是否有任何性能下降?我应该使用put而不是update有什么理由吗?


共3个答案

匿名用户

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

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

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

匿名用户

没有性能差异,但吞吐量有差异。

>

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

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

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

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

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

    单个属性的更新==GET-

    • SO主题:DynamoDb PutItem与UpdateItem的区别?
    • 关于数据消费的AWS文档:https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ProvisionedThroughput.html

  • 匿名用户

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

    putupdate在表中不存在项时具有相同的行为。降级到@Daniel Hornik提到的吞吐量差异,我不同意。在这种情况下,它们都使用相同的WCU。因此,如果您使用预置吞吐量进行写入,您可以期望相同级别的吞吐量。