我试图执行散列和范围键的独特组合,并遇到这篇文章。我发现它并没有完全回答我的问题,但肯定指出了我的正确方向。这是试图整理松散的目的。
似乎DynamoDB实际上是通过设计强制执行散列和范围键的唯一组合。我引用
“表中的所有项目必须有主键属性值和亚马逊DynamoDB确保了该名称的值是唯一的”
从http://aws.amazon.com/dynamodb/下与标题主键部分。
在我自己的使用putItem和aws-sdk for nodejs的测试中,我能够发布两个相同的项目而不会产生错误。当我检查数据库时,实际上只插入了一个项目。看起来第二次调用putItem时使用相同的散列和范围组合键被视为对原始项目的更新。
当我尝试在设置了值的散列键和范围键上设置exist = false选项时,我也收到错误“无法期望某个属性具有指定的值而期望它不存在”。为了解决这个错误,我删除了期望的散列和范围键下的值,当我试图插入相同的键两次时,它开始产生验证错误。
所以,我插入命令如下(将成为Java的不同,但希望你的想法)
{ "TableName": "MyTableName",
"Item" : {
"HashKeyFieldName": {
"S": HashKeyValue
},
"RangeKeyFieldName": {
"N": currentTime.getTime().toString()
},
"OtherField": {
"N": "61404032632"
}
},
"Expected": {
"HashKeyFieldName" : { "Exists" : false},
"RangeKeyFieldName" : { "Exists" : false}
}
}
而最初我试图做一个有条件的插入检查如果有一个哈希值和范围值与我试图插入的相同,现在我只需要检查HashField和RangeField是否存在。如果它们存在,那意味着我正在更新项目而不是插入。
真的很老的问题,但dynamodb有一个原子增量版本,看看(主要是人们在这里清盘) –
原子更新文档在这里:http://docs.aws.amazon.com/amazondynamodb/latest/APIReference/ API_UpdateItem.html – Deemoe