【问题标题】:Replace an old item with a new item in DynamoDB用 DynamoDB 中的新项目替换旧项目
【发布时间】:2019-10-06 01:39:07
【问题描述】:

我正在使用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”只有一个唯一的行

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 这取决于您的设计。如果您希望每个分区键只有一个值,那么拥有排序键是没有意义的,删除排序键将解决您的问题。但是,如果您想拥有状态更改的历史记录,那么您需要将 OrderID 和 Status(不带时间戳)作为您的复合主键,并使用类似于 this 的方法来管理最新状态
    【解决方案2】:

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

    没有可用于替换所有具有分区键的项目的 API,因此要实现您所描述的行为,您必须执行查询-删除-放置事务以实际将旧项目替换为新项目,除非您更改架构。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-10
      • 1970-01-01
      • 1970-01-01
      • 2020-05-25
      • 2019-01-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多