簡體   English   中英

如何在 DynamoDB 上應用條件放置?

[英]How to apply conditional put on DynamoDB?

我有一個名為 Check 的 dynamoDB 表,用於表示餐廳/酒吧中的一張表。

我想在此表上應用條件放置請求,以便只有滿足以下條件才能創建新表:

  1. tableNumber當前不存在並且
  2. restaurnatId當前不存在並且
  3. 表上的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.

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