2016-05-06 3 views
1

私はdynamiskdbテーブルを持っています。ここで、hashKeyはuserIdで、範囲キーはタイムスタンプです。dynamodb mapper、ハッシュ/範囲キーに関係なく重複レコードを防ぐ方法

dynamo dbテーブルにレコードを作成するいくつかのレガシーコードがあり、そのデータにはフィールドthreadId(レガシーデータベースのプライマリキー)があります。

重大なメッセージングプラットフォームのおかげで、重複したthreadIdsを持つレコードを取得することがあります。この場合、本番データベースには1つのレコードしか必要ありません。

私は次のように条件を設定しようとしました:

DynamoDBSaveExpression saveExpr = new DynamoDBSaveExpression(); 
     saveExpr.setExpected(new ImmutableMap.Builder() 
      .put("threadId", new ExpectedAttributeValue() 
       .withValue(new AttributeValue().withS(record.threadId)) 
       .withComparisonOperator(ComparisonOperator.NE)).build()); 
     mapper.save(record, saveExpr); 

しかし、これは動作しません。私は確信していませんが、userId/created(ハッシュ/範囲キー)の値が同じでない場合、dynamoは保存式に関係なく新しいレコードを作成します(文書と一致しないようです)。

何か間違っていますか?ハッシュ/範囲キーの値に関係なく重複レコードを防止する方法はありますか?

私はあなたが

put("threadId", new ExpectedAttributeValue() 
      .withValue(new AttributeValue().withS(record.threadId)) 
      .withComparisonOperator(ComparisonOperator.NE)).build()); 

が代わりになりたいと思います

答えて

0

上:

DynamoDBSaveExpression saveExpression = new DynamoDBSaveExpression(); 
    Map<String, ExpectedAttributeValue> expectedAttributes = 
     ImmutableMap.<String, ExpectedAttributeValue>builder() 
      .put(THREAD_ID, new ExpectedAttributeValue().withExists(false)) //The threadId doesn't exist or is empty 
      .build(); 
    saveExpression.setExpected(expectedAttributes); 
+0

私は保存式がキーでのみ動作すると思う、THREAD_IDはあなたの例ではハッシュまたは範囲キーですか? – Superaghu

+0

遅く返事を申し訳ありません、はいthread_idはハッシュキーです。 – mark

0

put("threadId", new ExpectedAttributeValue(false)) 

もっと詳しく私はこの解決するには、次の操作を行う必要がありましたAWS Blog

+0

遅れて申し訳ありませんが、これは近くにいた - 私は以下の答えを投稿します。 – mark

+0

すぐにその回答を投稿するつもりです@マーク? –

+0

@Peavers昨年6月以来そこにいたのですか? – mark

関連する問題