6

DynamoDB を使用してイベントを保存しています。これらは、ハッシュ キー「ソース ID」と範囲キー「バージョン」を持つ 1 つのイベント テーブルに格納されます。ソースに新しいイベントが発生するたびに、ソース ID とバージョン番号を増やした新しいアイテムを追加したいと考えています。

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

ハッシュキーだけのテーブルでこれを成功させました:

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

しかし、ハッシュ + 範囲キーを処理する方法がわからない....

4

2 に答える 2

3

Java SDK はよくわかりませんが、range_keyと の両方で「Exist=False」を指定できますhash_key

バージョン番号の代わりにタイムスタンプを使用することをお勧めします。それ以外の場合は、一意の ID を生成する手法もあります。

于 2012-10-25T19:00:33.087 に答える
2

ハッシュ キーと範囲キーの一意の組み合わせを強制しようとしていたところ、この投稿に出会いました。私の質問に完全には答えていないことがわかりましたが、確かに正しい方向に向けてくれました。これは、ルーズエンドを整理する試みです。

DynamoDB は実際には、ハッシュと範囲キーの一意の組み合わせを設計により強制しているようです。引用します

「テーブル内のすべてのアイテムには主キー属性の値が必要であり、Amazon DynamoDB はその名前の値が一意であることを保証します」

http://aws.amazon.com/dynamodb/の [Primary Key] という見出しのセクションから。

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

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

したがって、挿入コマンドは次のようになります (Java の場合は異なりますが、理解していただければ幸いです)。

{     "TableName": "MyTableName",

 "Item"          :  {

                          "HashKeyFieldName": {

                                   "S": HashKeyValue

                          }, 

                          "RangeKeyFieldName": {

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

                          },

                          "OtherField": {

                                   "N": "61404032632"

                          }

                      },

 "Expected":  {

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

                    }

}

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

于 2013-02-22T03:28:41.440 に答える