在DynamoDB中用新项目替换旧项目

时间:2019-05-19 13:10:51

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

我正在使用https://godoc.org/github.com/aws/aws-sdk-go-v2/service/dynamodb#DynamoDB.PutItemRequest

我的功能如下:

  func (h dynamoHandler) save(selection DeliveryDate) (err error) {
      av, err := dynamodbattribute.MarshalMap(selection)
      if err != nil {
          log.WithError(err).Error("failed to marshal selection")
          return
      }

      req := h.db.PutItemRequest(&dynamodb.PutItemInput{
          TableName: aws.String(h.Table),
          Item:      av,
      })
      _, err = req.Send()

      if err != nil {
          log.WithField("table", h.Table).WithError(err).Error("putting dynamodb")
          return
      }
      return
  }

我当时的假设是,由于分区键“ wfr5a”相同,因此较新的“ chosen#2019-05-19T13:42:54 + 08:00”(复合键和排序键)应该替换了行。

"OrderID (S)","StatusDate (S)","LastUpdated (S)"
"wfr5a","chosen#2019-05-19T13:42:54+08:00","2019-05-19T13:49:34+08:00"
"wfr5a","proposal#2019-05-19T13:42:54+08:00","2019-05-19T13:42:58+08:00"

尽管您可以看到,它创建了一个新项目。我缺少什么,所以它只替换记录,即“ wfr5a”只有一个唯一的行

2 个答案:

答案 0 :(得分:1)

当您拥有复合主键(分区键+排序键)时,这两个字段的组合是唯一的,而不是分区键。

答案 1 :(得分:0)

听起来您需要做的就是从架构中删除排序键。这样,每个项目将仅通过分区键唯一地标识。

没有可用的API来替换所有具有分区键的项目,因此,要实现您描述的行为,您必须执行query-delete-put事务,才能用新项目实际替换旧项目,除非您更改了模式。