是否可以在 DynamoDB 中有条件地更新值?

Is it possible to update a value conditionally in DynamoDB?

假设我在 DynamoDB 中存储具有以下结构的记录:

{
    "id": "574edeac445084d8d5aacc99b941d9d6",
    "status": "NEW",
    "blocked": false
}

是否可以在一个请求中实现以下目标?

如果具有给定 ID 的记录被阻止,则将状态更新为 BLOCKED 或 APPROVED

不幸的是,没有。在 单个请求 中,您可以包含一个 ConditionExpression,它将:

  1. 如果条件评估为真则执行更新
  2. 如果条件评估为 false,则中止更新

对于您的实施,您似乎需要支持某种 if ... else UpdateExpression 函数,根据 list of comparison and function references for update expressions,该函数不可用.

如果这不是非常频繁的操作,多个请求可能没问题。我可以想到两个选项:

  1. 执行 GET 请求,然后在您的应用程序中根据 GET 的响应计算要在 UPDATE 中发送的值。
  2. 使用您预期最成功的 ConditionExpression 尝试“盲”UPDATE 请求,如果失败,则计算新值并将其与第二个 UPDATE 请求一起发送。

例如:如果您认为一个条件表达式有 3/4 的时间计算结果为真,那么您只有 25% 的时间发出两个更新请求。如果您使用上面的 GET 方法,您将在 100% 的时间内进行 GET 和 UPDATE。如果第一次“盲目”更新尝试失败的可能性为 50/50,则仅使用选项编号 1 可能更容易。

如果这个 是一个非常流行的操作,您可能需要重新考虑您的 table 设计。您或许可以 leverage sparse indexes 实现您的目标。