我正在使用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”只有一个唯一的行
答案 0 :(得分:1)
当您拥有复合主键(分区键+排序键)时,这两个字段的组合是唯一的,而不是分区键。
答案 1 :(得分:0)
听起来您需要做的就是从架构中删除排序键。这样,每个项目将仅通过分区键唯一地标识。
没有可用的API来替换所有具有分区键的项目,因此,要实现您描述的行为,您必须执行query-delete-put事务,才能用新项目实际替换旧项目,除非您更改了模式。