如果我创建这样的PutItem请求会发生什么:
{
"Expected":
{
"testAttribute" :
{
"Exists": "false",
}
},
"Item":
{
"testAttribute" :
{
"S": "testValue"
}
},
"TableName": "TableName"
}
其中“testAttribute”不是主键的一部分。
DynamoDB会扫描表格以查看是否存在属性为“testAttribute”==“testValue”的项目? 如果没有,DynamoDB将如何确定“testAttribute”==“testValue”的存在? 我在文档中找不到任何描述它是如何工作的东西。
答案 0 :(得分:4)
根据documentation of the PutItem
action,您不得发出该请求。它说:
项目:属性名称/值对的映射,每个属性一个。 仅需要主键属性;您可以选择为项目提供其他属性名称 - 值对。
(强调我的)
每当您使用PutItem
时,您必须为主键的每个属性提供一个值。
这样,您肯定会同意,DynamoDB检查您在Expected
子句中定义的条件非常简单快速:不需要扫描,只需查看单个项目即可可以匹配请求。否则,正如您所指出的,DynamoDB需要执行全表扫描(它可能会非常慢,并且它们肯定会向您收取费用),或者它需要维护表中每个项目的一致索引,他们会向你收取用于存储它的SSD空间!
另请注意,期望子句的含义与您在问题中描述的略有不同。假设您修复了请求并添加了所有主键属性,请求意味着:
“如果此主键标识的项目不存在,请创建它;如果它确实存在且不包含名为 testAttribute 的属性,请将项目替换为其属性所描述的项目。此请求;如果项目确实存在且包含名为 testAttribute 的属性,则不执行任何操作“。
您的描述表明DynamoDB会检查 testAttribute 的值是否为 testValue ,但是当您使用Expected/Exists
子句时不会发生这种情况。要实现您描述的效果,您需要使用Expected/Value
子句,然后在该子句中指定您期望的值 - 为请求的Item
属性中的属性指定的值如果要发生更新(或插入),则仅用于定义属性的新值。