Amazon web services 用DynamoDB中的新项替换旧项

Amazon web services 用DynamoDB中的新项替换旧项,amazon-web-services,go,amazon-dynamodb,Amazon Web Services,Go,Amazon Dynamodb,我正在使用 我的函数如下所示: 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

我正在使用

我的函数如下所示:

  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相同,较新的chosen2019-05-19T13:42:54+08:00A组合和排序键应该替换该行

"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只有一个唯一的行

当您使用复合主键partition key+sort key时,这两个字段的组合是唯一的,而不是分区键。

听起来您需要做的是从架构中删除sort key。这样,每个项将仅通过分区键进行唯一标识


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

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