2017-10-02 83 views
1

Imaxを使用して新しいデータをDynamoDBテーブルに追加しようとしています。エントリが既に存在する場合に、上書きされるDynamoDBアイテムを防止する方法

http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/DocumentClient.html#put-property PUTメソッド::でドキュメントを読んでから、 は、「新しいアイテムを作成、またはAWS.DynamoDB.putItem()に委譲することで、新たなアイテムで古いアイテムを置き換えます。」

PUTを試行したときにオブジェクトが存在するかどうかを確認するための設定やフラグがあるかどうかを確認する以外に、オブジェクトのチェックを行う以外の方法はありますか?

私は

params -> Expected -> Exists (Bool) 

で見ることができるが、これが何をするか上の任意のドキュメントを参照してくださいすることはできません。

アイテムが上書きされないようにするには、最高のアーキテクチャ(または断食)は何ですか?

Query the table first and if no item exists then add the item 

又は

Attempt to insert the item and on failure because of duplicate entry report this back? (Is there a way to prevent item overwrite?) 

答えて

4

ConditionExpressionはキー値がテーブル内に存在しない場合にのみ、キー属性値がすでにテーブルに存在するかどうかをチェックし、PUT動作を実行するために使用することができます。

次のコードを実行すると、初めてput操作が成功する必要があります。 2回目の実行では、"条件付き要求が失敗しました"と表示され、put操作は失敗します。例外。

My moviesテーブルには、パーティションキーと並べ替えキーの両方があります。だから、私は条件式の両方の属性を使用しています。条件付きのPUTと

サンプルコード: -

var table = "Movies"; 

var year = 1502; 
var title = "The Big New Movie"; 

var params = { 
    TableName:table, 
    Item:{ 
     "yearkey": year, 
     "title": title, 
     "info":{ 
      "plot": "Nothing happens at all.", 
      "rating": 0 
     } 
    }, 
    ConditionExpression: "yearkey <> :yearKeyVal AND #title <> :title", 
    ExpressionAttributeNames: { 
     "#title" : "title" 
    }, 
    ExpressionAttributeValues: { 
     ":yearKeyVal" : year, 
     ":title": {"S": title} 
    } 
}; 

console.log("Adding a new item..."); 
docClient.put(params, function(err, data) { 
    if (err) { 
     console.error("Unable to add item. Error JSON:", JSON.stringify(err, null, 2)); 
    } else {   
     console.log("Added item:", JSON.stringify(data, null, 2)); 
    } 
}); 

例外置く操作が二度目に実行されます -

Unable to add item. Error JSON: { 
    "message": "The conditional request failed", 
    "code": "ConditionalCheckFailedException", 
    "time": "2017-10-02T18:26:26.093Z", 
    "requestId": "7ae3b0c4-3872-478d-908c-94bc9492a43a", 
    "statusCode": 400, 
    "retryable": false, 
    "retryDelay": 0 
} 
+0

あなたの情報やお手伝いをしていただきありがとうございます。 –

0

が、私はとにかく、この質問は、JavaScript言語に関連していることがわかり私はJavaのためにも書いています(誰かにとって有益かもしれません):

DynamoDBSaveExpression saveExpression = new DynamoDBSaveExpression(); 
Map<String, ExpectedAttributeValue> expectedAttributes = 
     ImmutableMapParameter.<String, ExpectedAttributeValue>builder() 
       .put("hashKeyAttrName", new ExpectedAttributeValue(false)) 
       .put("rangeKeyAttrName", new ExpectedAttributeValue(false)) 
       .build(); 
saveExpression.setExpected(expectedAttributes); 
saveExpression.setConditionalOperator(ConditionalOperator.AND); 

try { 
    dynamoDBMapper.save(item, saveExpression); 
} catch (ConditionalCheckFailedException e) { 
    e.printStackTrace(); 
} 

ConditionalCheckFailedExceptionは、既存のhashKeyとrangeKeyのペアを持つアイテムをDynamoDBに保存しようとする場合にスローされます。

関連する問題