假设我在DynamoDB中存储具有以下结构的记录:
{
"id": "57cf5b43-f9ec-4796-9de6-6a50f556cfd8",
"created_at": "2015-09-18T13:27:00+12:00",
"count": 3
}
Run Code Online (Sandbox Code Playgroud)
现在,是否可以在一个请求中实现以下功能:
id不存在,则应使用count = 1创建id存在,则计数器正在更新.目前我正在进行查询以检查记录是否存在,并且取决于我执行的操作put或结果update.把它折叠成一个单独的操作会很好.
mko*_*bit 18
您可以使用UpdateItemAPI和UpdateExpression因为您的用例来执行此操作.既然这里count是一个Number类型,你可以使用SET或ADD表达式:
该文档ADD告诉您可以将其用于Number类型(强调我的):
ADD - 如果该属性尚不存在,则将指定的值添加到项目中.如果该属性确实存在,那么ADD的行为取决于属性的数据类型:
- 如果现有属性是数字,并且Value也是数字,则Value将以数学方式添加到现有属性中.如果Value为负数,则从现有属性中减去该值.
如果使用ADD递增或递减更新前不存在的项的数值,DynamoDB将使用0作为初始值.同样,如果对现有项使用ADD来递增或递减更新前不存在的属性值,则DynamoDB使用0作为初始值.例如,假设您要更新的项目没有名为itemcount的属性,但您仍决定将数字3添加到此属性.DynamoDB将创建itemcount属性,将其初始值设置为0,最后添加3.结果将是项目中的新itemcount属性,值为3.
对于你的榜样,你可以有你的UpdateExpressionBE ADD #c :n,其中:n有ExpressionAttributeValue对的Number类型,1是值,并且#c有ExpressionAttributeName进行替代count.您需要使用占位符,count因为它是一个保留字.
请参阅有关使用更新表达式修改项目和属性的更多示例
Pio*_*rek 16
在我的问题中我没有提到的是我想要在count没有修改的情况下进行后续事件created_at.我的最终工作UpdateInput看起来像这样:
{
Key: {
id: {
S: "some_unique_id"
}
},
TableName: "test",
ExpressionAttributeNames: {
#t: "created_at",
#c: "count"
},
ExpressionAttributeValues: {
:t: {
S: "2015-09-26T15:58:57+12:00"
},
:c: {
N: "1"
}
},
UpdateExpression: "SET #t = if_not_exists(#t, :t) ADD #c :c"
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
19953 次 |
| 最近记录: |