如果值不存在,dynamodb 是否支持 SET 操作上的原子计数器?
我有一个用例,需要在 DynamoDB 中存储查看博客文章的人数。
假设我有一个像下面这样的表
blogId | Total Views。 |
---|---|
1 | 100 |
现在,当用户查看 ID 为 2
的新博客时,我必须将其存储在表中。我可以执行以下操作来实现此目的:
isBlogExists = dynamodbMapper.get(BlogViews,{blogId: 2})
if (isBlogExists){
dynamodbMapper.set("totalViews", new MathematicalExpression("totalViews", "+", 1))
} else{
dynamodbMapper.set("totalViews", 1)
}
不幸的是,它最终会出现竞争条件,因此我计划使用这样的 SET
操作
dynamodbMapper.set("totalViews", new MathematicalExpression("totalViews", "+", 1))
由于该项目没有totalViews属性,因此我收到了类似的错误
在表中找不到带有密钥的项目。
那么 DynamoDB 是否不支持在不存在的键上递增数值?
我可以使用 ADD
操作,但 DynamoDB 建议使用 SET
而不是 ADD
(来源)。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
DynamoDB 提供了在 UpdateExpression 中使用
ADD
的简单方法,但 AWS 通常建议改为使用SET
:我不明白为什么,他们也没有详细说明。如果您想遵循他们的指导,您可以执行以下操作。
在某些情况下,简单的
SET attr = attr + 1
是不够的,因为它要求属性已经存在。如果不是这种情况,ADD
表达式会假定默认值为 0,而SET
则不会。幸运的是,我们可以使用
if_not_exists
功能。这是如何使用它的示例。它假设一个名为pk-only
的表,只有一个名为PK
的字符串类型分区键。(这是 Python 中的示例,但您应该能够轻松地将其适应您的 Javascript 代码)
DynamoDB offers the straightforward way of using
ADD
in the UpdateExpression, but AWS generally recommends going withSET
instead:I don't see why and they don't elaborate on that. If you want to follow their guidance, here is what you can do.
The straightforward
SET attr = attr + 1
falls short in some cases because it requires the attribute to exist already. TheADD
expression assumes a default of 0 if that's not the case,SET
doesn't.Fortunately, we can create a default for non-existent attributes using the
if_not_exists
function. Here's an example of how to use it. It assumes a table calledpk-only
with only a partition key calledPK
of type string.(This is an example in Python, but you should be able to adapt it to your Javascript code quite easily)