如何在DynamoDB上应用条件放置?



我有一个名为Cheque的dynamoDB表,用于表示餐厅/酒吧中一张桌子的支票。

我想在这个表上应用一个条件put请求,这样一个新表只能在满足以下条件时创建:

  1. tableNumber当前不存在AND
  2. restaurnatId目前不存在AND
  3. 表上isOpen状态为假(即支票未开)

我正在创建我的DynamoDB在Terraform像这样:

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将是一个更好的键,您可以将排序键设置为checeid,以确保项目是唯一的。

现在您可以有条件地为给定的餐厅/支票放置一个项目,并且您的条件将正确评估,因为您不会每次都生成一个新项目。

最新更新