2016-05-18 11 views
0

DynamoDBMapper von dynamoDb verwenden Ich muss Folgendes tun: 1. Überprüfen Sie, ob der Follower-Tabelle bereits ein Follower mit einer bekannten leaderId und userId hinzugefügt wurde.
2. Wenn eine solche Folger gefunden wurde - ändern Sie es Zustand ist auf „ACTIVE“
3. Wenn eine solche Folger nicht gefunden wurde - speichern Sie eine neue Follower mit bestimmten leaderId/followerId und Zustand „ACTIVE“
dynamoDb - Neues Element hinzufügen, wenn der Tabelle bereits keine ähnlichen Elemente hinzugefügt wurden

Bundesstaat Folger wird in der gesamten Anwendung verwendet werden, da wir den Workflow
mit dem Status verwalten (wir versuchen, keine Daten in der Datenbank zu löschen).

Die vereinfachte "Follower" Klasse:

public class Follower { 

@DynamoDBHashKey 
@DynamoDBAutoGeneratedKey 
private String id; 

    private String leaderId; 
    private String followerId; 
    private String state; 
} 

Meine aktuelle Lösung ist 1. Verwendung DynamoDBMapper Liste, die Follower-s zu laden erfüllen die gegebene leaderID/followerId Parameter 2. Wenn keine Ergebnisse - wir erzeugen einen neuen Follower, ansonsten aktualisieren wir den Zustand eines bestehenden

Allerdings hoffe ich, dass eine elegantere "in einem DynamoDBMapper Call" -Lösung existiert.

public void follow(String leaderId, String followerId) { 
    Follower follower = findFollower(leaderId, followerId); 

    if(follower == null){ 
     follower = new Follower(); 
     follower.setLeaderId(leaderId); 
     follower.setFollowerId(followerId); 
    } else { 
     follower.getBase().setState("ACTIVE"); 
    } 

    getDbMapper().save(follower); 
} 
+1

Sie könnten leaderId-folgerId als Compound-Schlüssel verwenden und einfach die Entität schreiben, ohne zu prüfen, ob sie existiert. Dies kann manchmal funktionieren, wenn eines der vorhandenen ['SaveBehavior'] (http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/datamodeling/DynamoDBMapperConfig.SaveBehavior.html) s passt zu Ihrem Anwendungsfall (aber Sie verlieren optimistisches Sperren durch Versionierung, da Sie eine Version nicht erwarten und inkrementieren können, ohne sie zu kennen) – zapl

Antwort

1

Sie können es mit DynamoDBMapperConfig.SaveBehavior.UPDATE_SKIP_NULL_ATTRIBUTES tun.

Ich hatte das gleiche Problem zuvor. Ich könnte es mit der Funktion unten lösen.

/** 
    * It's either save or update if the record is exist using param Follower data 
    * 
    * @param Follower object of the follower data 
    */ 
    private static void saveOrUpdateAccountOperation(Follower followerData) { 
     AmazonDynamoDBClient amazonDynamoDBClient; 
     if (CognitoSyncClientManager.getInstance().isUserLogin()) { 
      amazonDynamoDBClient = new AmazonDynamoDBClient(CognitoSyncClientManager.getInstance().getCredentialsProvider()); 
     } else { 
      amazonDynamoDBClient = new AmazonDynamoDBClient(AWSMobileClient.defaultMobileClient().getIdentityManager().getCredentialsProvider()); 
     } 
     // UPDATE_SKIP_NULL_ATTRIBUTES is similar to UPDATE, except that it ignores any null value attribute(s) and will NOT remove them from that item in DynamoDB. 
     DynamoDBMapper dynamoDBMapper = new DynamoDBMapper(amazonDynamoDBClient, 
       new DynamoDBMapperConfig(DynamoDBMapperConfig.SaveBehavior.UPDATE_SKIP_NULL_ATTRIBUTES)); 
     // create or update the existing record 
     dynamoDBMapper.save(followerData); 
    } 

Sie übergeben nur Ihre Follower-Objekt zu dieser Funktion wird es kümmern sich um alle drei Bedingungen.

  1. Wenn Sie Follower Objekt leaderId und userId nicht vorhanden, dann wird es es schaffen und hinzugefügt, alle anderen Attribute mit einem Standardwert.
  2. Wenn die angegebenen Follower gefunden werden, dann vergewissern Sie sich, dass Ihr Follower Klassenstatus den Wert "ACTIVE" hat und nur für diese Attribute aktualisiert wird.

Vielen Dank.

+0

Das Problem in meinem Fall war, dass ich DynamoDBMapper.save nicht erklären konnte - welche Zeile zu aktualisieren ist, da ich die Primärdatenbank nicht kannte Schlüssel zum Zeitpunkt des Speicherns/Aktualisierens des Artikels. Ich habe es gelöst, indem ich das "id" -Feld eliminiert habe und einen zusammengesetzten Schlüssel aus "folgerId" und "leaderID" gemäß dem @ zapl-Vorschlag erstellt habe. –