dynamodb:有条件地创建/更新项目并返回当前值

时间:2016-04-08 18:33:19

标签: amazon-web-services go amazon-dynamodb

dynamoDB中是否可以有条件地创建/更新项目并返回其当前值?

在下面我们有三种状态,一种是用户不在表中,一种是用户在表中但没有CreatedAt字段,另一种是用户存在且具有CreatedAt字段。

out, err := db.UpdateItem(&dynamodb.UpdateItemInput{
  TableName: aws.String("User"),
  Key: map[string]*dynamodb.AttributeValue{
    "ID": {S: aws.String(u.ID)},
  },
  ExpressionAttributeNames: map[string]*string{
    "#c": aws.String("CreatedAt"),
  },
  ExpressionAttributeValues: map[string]*dynamodb.AttributeValue{
    ":c": {S: aws.String(u.CreatedAt.Format(time.RFC3339))},
  }
  ConditionExpression: aws.String("attribute_not_exists(#c)"),
  UpdateExpression:    aws.String("SET #c = :c"),
  ReturnValues:        aws.String("ALL_NEW"),
})
if isConditionError(err) {
  // out.Attributes == nil
  // .: out.Attributes["CreatedAt"] == ""
}

当用户不在时,这会按预期创建用户。

当用户没有CreatedAt字段时,它会按预期添加该字段。

当条件失败时(即用户具有CreatedAt的值),我想知道数据库在该用户的CreatedAt字段中所说的内容。不幸的是,无论我是为ReturnValues指定ALL_NEW还是ALL_OLD,out.Attributes总是为零。

我想避免两次调用数据库来获取这些信息,因为我知道发电机正在读它以评估条件,我认为这是合理的。我该怎么做?

0 个答案:

没有答案