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