簡體   English   中英

在將項目添加到 DynamoDB 表時我應該使用 put 還是 update 命令

[英]Should I use put or update command while adding an item to DynamoDB table

year作為主鍵,項目為:

let item = {

    "year": 2021,
    "title": "Title A"
}

我可以提前 go 並使用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);
});

請注意,我在這里使用ConditionExpression來確保表中不存在具有相同主鍵year 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”指定為ReturnValues參數的參數(對於put命令,選項“ALL_NEW”不可用)。

使用update命令與put相比是否有任何性能下降? 有什么理由我應該使用put而不是update嗎?

沒有性能差異,但在吞吐量方面存在差異。

  • PutItem - 將單個項目寫入表。 如果表中存在具有相同主鍵的項,則操作替換該項。 對於計算預置吞吐量消耗,重要的項目大小是兩者中的較大者。

  • UpdateItem - 修改表中的單個項目。 DynamoDB 會考慮更新前后顯示的項目大小。 消耗的預置吞吐量反映了這些項目大小中的較大者。 即使您僅更新項目屬性的子集,UpdateItem 仍將消耗全部預置吞吐量(“之前”和“之后”項目大小中的較大者)。

以上引用來自官方 AWS 文檔(請參閱參考資料)

然而,一切都取決於你在做什么:

PUT 項目替換 DynamoDB 中的整個條目。 UPDATE 只能更新單個屬性。 您也可以使用 PUT 更新屬性。

更新單個屬性 == GET -> 修改代碼中的單個屬性 -> PUT 記錄數據到 DB

參考:

對我而言,主要區別在於您可以添加一個 ConditionExpression,這樣您就不會意外覆蓋已經存在的鍵。 例子:

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) 以僅在該鍵不存在時插入。 我覺得這可以讓您更好地控制何時/何時不將數據推送到您的表中。

簡而言之,在這種特殊情況下,沒有區別。

當項目在表中不存在時, putupdate具有相同的行為。 對於@Daniel Hornik 提到的吞吐量差異,我不同意。 在這種情況下,它們都使用相同的 WCU。 因此,如果您使用預置吞吐量進行寫入,則可以預期相同級別的吞吐量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM