2012-10-25 42 views
5

私はDynamoDBを使用してイベントを格納しています。 ハッシュキー「ソースID」と範囲キー「バージョン」を使用して、1つのイベントテーブルに格納されます。ソースに対して新しいイベントが発生するたびに、ソースIDとバージョン番号が増えた新しいアイテムを追加します。DynamoDB:条件付き書き込みを実行して一意のハッシュ+範囲キーを適用する方法

重複した項目(同じハッシュキーと同じ範囲キー)が決して存在しないように条件付き書き込みを指定できますか?もしそうなら、あなたはどうしますか?私は、Java SDKをよく知らない....

Map<String, ExpectedAttributeValue> expected = new HashMap<String, ExpectedAttributeValue>(); 
expected.put("key", new ExpectedAttributeValue().withExists(false)); 

でもないハッシュ+範囲のキーを処理する方法がわから

+1

本当に古い質問ですが、dynamodbには原子インクリメントのバージョンがあります(これは主にここで人が巻き込まれている人向けです) –

+0

原子的更新ドキュメントはこちら:http://docs.aws.amazon.com/amazondynamodb/latest/APIReference/ API_UpdateItem.html – Deemoe

答えて

3

を:私はちょうどハッシュキーを持つテーブルのためにこれを正常に行っている

range_keyhash_keyの両方に「Exist = False」と指定することができます。

バージョン番号の代わりにタイムスタンプを使用するとよいでしょうか?それ以外の場合は、ユニークなIDを生成する手法もあります。

+0

チップをありがとう!私は "Exist = False"を範囲キーとハッシュキーに指定しようとします。興味のないところから、バージョン番号の代わりにタイムスタンプを使用するほうがよいと提案したのはなぜですか? – stikkos

+0

"id"世代のスペアのみ: – yadutaf

+0

私はこれを試したが、まだこれを動作させることができません....私はエラーが表示されます: "期待値の間に指定された値を持つ属性を期待できませんそれは存在しない "。何か案が?? – stikkos

2

私はハッシュとレンジキーのユニークな組み合わせを強制しようとしていましたが、この投稿に出会いました。私はそれが完全に私の質問に答えることはできませんでしたが、確かに正しい方向に私を指摘した。これは、緩い端を整える試みです。

DynamoDBは実際には設計上、ハッシュとレンジキーのユニークな組み合わせを強制しているようです。私は、「テーブル内のすべての項目は、主キー属性の値を持たなければならないとAmazon DynamoDBのは、その名の値が一意であることを保証し、」見出しの主キーを持つセクションの下http://aws.amazon.com/dynamodb/から

を引用します。

nodejsのaws-sdkでputItemを使用して私自身のテストでは、エラーを生成せずに2つの同一アイテムを投稿できました。データベースをチェックすると、実際には1つのアイテムしか挿入されませんでした。同じハッシュと範囲のキーの組み合わせでputItemを呼び出す2回目の呼び出しは、元のアイテムへの更新のように扱われるようです。

値が設定されたハッシュキーと範囲キーにexist = falseオプションを設定しようとしたときに、「属性が指定された値を持つことは期待できません」というエラーが表示されました。このエラーを解決するには、予想されるハッシュと範囲キーの下の値を削除し、同じキーを2回挿入しようとしたときに検証エラーを生成し始めました。

だから、私のinsertコマンドは次のようになります(Java用の異なるもの、うまくいけばあなたのアイデアを得るでしょう)

{  "TableName": "MyTableName", 

"Item"   : { 

          "HashKeyFieldName": { 

            "S": HashKeyValue 

          }, 

          "RangeKeyFieldName": { 

            "N": currentTime.getTime().toString() 

          }, 

          "OtherField": { 

            "N": "61404032632" 

          } 

         }, 

"Expected": { 

         "HashKeyFieldName"  : { "Exists" : false}, 
         "RangeKeyFieldName"  : { "Exists" : false} 

        } 

}

もともと私がチェックするために、条件付きの挿入を行うにしようとしていたのに対し私が挿入しようとしていたものと同じハッシュ値と範囲値があったら、今はHashFieldとRangeFieldが存在するかどうかを確認するだけです。それらが存在する場合は、挿入するのではなくアイテムを更新していることを意味します。

関連する問題