是否可以在DynamoDB中进行条件放置或更新?

Pio*_*rek 27 amazon-dynamodb

假设我在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类型,你可以使用SETADD表达式:

该文档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,其中:nExpressionAttributeValue对的Number类型,1是值,并且#cExpressionAttributeName进行替代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)

  • 这非常适合“upsert”操作。 (3认同)