我正在使用DynamoDB来存储事件。它们存储在1个事件表中,带有哈希键'源ID'和范围键"版本"。每次为源发生新事件时,我都想添加一个带有源ID的新项目,并增加版本nr。
是否可以指定有条件的写入,以使重复的项目(相同的哈希键和相同的范围键)永远不存在?如果是这样,您将如何执行此操作?
我已经成功地使用了一个hash键来完成此操作:
Map<String, ExpectedAttributeValue> expected = new HashMap<String, ExpectedAttributeValue>();
expected.put("key", new ExpectedAttributeValue().withExists(false));
,但不确定如何处理哈希 范围键....
我不知道java sdk很好,但是您可以指定 range_key
和 hash_key
上的false"。
也许一个更好的主意可能是使用时间戳而不是版本号?否则,也有生成唯一ID的技术。
我试图执行哈希和范围键的独特组合,并遇到了这篇文章。我发现这并没有完全回答我的问题,但肯定指出了我的方向。这是一种修复松散的末端的尝试。
似乎DynamoDB实际上实现了通过设计的唯一组合和范围键的组合。我引用
"表中的所有项目都必须具有主要密钥属性和Amazon DynamoDB的值,可确保该名称的值是唯一的"
from http://aws.amazon.com/dynamodb/在该部分带有标题主要钥匙。
在我自己的测试中,使用putItem和aws-sdk for nodejs,我能够在没有产生错误的情况下发布两个相同的项目。当我检查数据库时,实际上只插入了一个项目。看来,使用相同哈希和范围键组合的第二个呼叫将其视为对原始项目的更新。
我也收到了错误"当我尝试在Hash键上设置Antive = false选项,并使用值设置的值设置range键时,"不能期望属性具有指定值的同时具有指定值。"为了解决此错误,我删除了预期的哈希和范围键下的值,当我尝试两次插入相同的密钥时,它开始生成验证错误。
所以,我的插入命令看起来像这样(对于java来说会有所不同,但希望您明白了)
{ "TableName": "MyTableName",
"Item" : {
"HashKeyFieldName": {
"S": HashKeyValue
},
"RangeKeyFieldName": {
"N": currentTime.getTime().toString()
},
"OtherField": {
"N": "61404032632"
}
},
"Expected": {
"HashKeyFieldName" : { "Exists" : false},
"RangeKeyFieldName" : { "Exists" : false}
}
}
最初我试图做一个有条件的插入物来检查哈希值和范围值是否与我要插入的范围相同,现在我只需要检查哈希菲尔德和Rangefield是否存在。如果它们存在,那意味着我正在更新项目而不是插入。