2016-05-06 5 views
1

Ich habe eine Dynamo-DB-Tabelle, wo der HashKey die userId ist und der Bereichsschlüssel Timestamp erstellt.Dynamodb Mapper, wie doppelte Datensätze unabhängig von den Hash/Range-Schlüssel zu verhindern

Wir haben einige Legacy-Code, der Datensätze in der Dynamo-DB-Tabelle erstellt, und diese Daten haben ein Feld threadId (der Primärschlüssel aus der Legacy-DB).

Gelegentlich (dank der zugrunde liegenden Messaging-Plattform) bekomme ich Datensätze mit doppelten threadIds und in diesem Fall möchte ich nur einen Datensatz in der Produktionsdatenbank.

Ich habe versucht, einen Zustand wie folgt eingestellt:

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); 

aber das funktioniert nicht. Ich bin mir nicht sicher, aber wenn die userId/created (hash/range key) -Werte nicht identisch sind, erstellt Dynamo einen neuen Datensatz unabhängig vom Save-Ausdruck (der nicht mit der Dokumentation übereinstimmt).

Mache ich etwas falsch? Gibt es eine Möglichkeit, einen doppelten Datensatz unabhängig von den Werten der Hash/Range-Schlüssel zu verhindern?

Antwort

0

Ich hatte diese vor zu beschließen zu tun:

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

Ich denke, der Speicherausdruck funktioniert nur für Schlüssel, ist THREAD_ID ein Hash oder Bereichsschlüssel in Ihrem Beispiel? – Superaghu

+0

Sorry für die späte Antwort, ja thread_id ist ein Hash-Schlüssel. – mark

0

Ich glaube, Sie

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

stattdessen sein wollen:

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

Weitere Einzelheiten zu dem AWS Blog

+0

Entschuldigung für die Verzögerung, dies war in der Nähe - ich werde eine Antwort unten posten. – mark

+0

Gehen Sie diese Antwort bald @mark? –

+0

@Peavers es ist dort seit Juni letzten Jahres gewesen? – mark

Verwandte Themen