[英]How to apply conditional put on DynamoDB?
我有一個名為 Check 的 dynamoDB 表,用於表示餐廳/酒吧中的一張表。
我想在此表上應用條件放置請求,以便只有滿足以下條件才能創建新表:
tableNumber
當前不存在並且restaurnatId
當前不存在並且isOpen
狀態為false(即檢查未打開)我正在 Terraform 中創建我的 DynamoDB,如下所示:
resource "aws_dynamodb_table" "ChequesDDB" {
name = "Cheques_${var.env_name}"
hash_key = "id"
billing_mode = "PROVISIONED"
read_capacity = 5
write_capacity = 5
stream_enabled = true
stream_view_type = "NEW_AND_OLD_IMAGES"
attribute {
name = "id"
type = "S"
}
attribute {
name = "tableNumber"
type = "N"
}
global_secondary_index {
name = "TableNumber"
hash_key = "tableNumber"
write_capacity = 5
read_capacity = 5
projection_type = "ALL"
}
}
注意:我不確定是否需要將tableNumber
設置為二級索引,但如果不需要,請告訴我。
然后我嘗試使用以下代碼在 DynamoDB 表中創建一個新檢查:
const tableData: Cheque = {
id: randomUUID(),
isOpen: true,
tableNumber: cheque.tableNumber,
restaurantId: cheque.restaurantId,
createdAt: new Date().toISOString(),
updatedAt: new Date().toISOString(),
};
const params: DynamoDB.DocumentClient.PutItemInput = {
TableName: env.CHEQUE_DDB,
Item: tableData,
ConditionExpression: "attribute_not_exists(tableNumber)"
};
await this.db.put(params).promise();
首先,我只是嘗試應用一個條件,即確保tableNumber
不存在。
但是每次我運行這段代碼時,它都會在表中創建一個新條目,我最終會打開多個表號為x
的支票。
如果我將我的條件表達式更新為attribute_not_exists(id)
那么它似乎會阻止其他條目使用相同的id
打開。 這是因為id
是主鍵嗎?
我如何將這些條件應用於不是主鍵的字段並防止使用相同的表號打開多個檢查?
條件檢查僅放置在單個項目上,在您的情況下,您每次都會生成一個唯一的,以便始終寫入一個新項目,因為該唯一 ID 不存在任何項目。
我強烈建議不要為分區鍵生成唯一 ID,因為它對您來說基本上沒有用。
RestaurantId 將是一個更好的鍵,您可以將排序鍵設置為 chequeId 以確保項目是唯一的。
現在您可以有條件地為給定的餐廳/支票放置一個項目,並且您的條件將正確評估,因為您不會每次都生成一個新項目。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.