2016-05-09 7 views
2

Ich bin gerade auf dem ersten DynamoDB Projekt gestartet und ich habe versucht, die Dokumentation so viel wie möglich zu lesen. Ich denke, die beste Möglichkeit für mein Projekt ist den High Level DynamoDbMapper im SDK zu verwenden, um CRUD-Operationen zu ermöglichen.Java DynamoDBMapper. Mapping Attributwert ‚M‘

In der DynamoDB Dokumentation gibt es eine Art von Attribut-Wert ‚M‘, die in der unteren Ebene Java API http://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_AttributeValue.html

hier zu sehen ist, wie getItem oder getItemBatch, übersetzt dieser Wert Typ java. util.map <>.

Aber ich kann keine Ressourcen scheinen zu finden, die sagen, dass ich das übergeordnete DBMapper verwenden kann diesen Datentyp zu verwenden. Unterstützte Datentypen hier. http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBMapper.DataTypes.html

Ich bemerkte am unteren Rand der Seite gibt es einige Einblicke in die Erstellung Ihrer eigenen übergeordneten Mapping-System. Aber ich dachte, ich würde hier zuerst fragen, bevor ich mich in den Code begab, um das zu versuchen. Also ich denke, meine Frage ist ... Gibt es trotzdem die DynamoDBMapper zu verwenden, um mit einem Java.Util.Map Datentyp zu arbeiten?

Der einzige Einsicht, die ich auf Google war diese seltsame Github Fehler finden konnte, wo der Benutzer scheinbar genau das tut, was ich tun möchte. https://github.com/aws/aws-sdk-java/issues/520

Hoffnung das macht Sinn. Ralph

+0

Haben Sie das jemals herausgefunden? – BinaryShrub

Antwort

1

UPDATE: Bemerkt, dass Sie eine Java.Util.Map Eigenschaft in DynamoDB Karte Attribut Karte benötigen, so unten alles beantwortet Ihre Frage nicht, sorry. In meinem Fall wird eine Eigenschaft der benutzerdefinierten Klasse verwendet, keine Eigenschaft der Java.Util.Map-Klasse.


Angenommen, Ihr Tabellenname "my_table" hat, und nehmen wir die folgende ist ein Json-Dump eines Datensatzes:

{ 
    uuid: "52f9d257-7998-4379-928b-9d41d70dd8a8", 
    my_map: { 
    field1: 123, 
    field2: 456 
    } 
} 

(Hier my_map wird das gewünschte Feld von 'M' Typ)

um DynamoDBMapper für eine solche Tabelle zu verwenden, müssten Sie zwei kommentierten Klassen erstellen, die erste für die Tabelle selbst:

import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBAttribute; 
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBHashKey; 
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBTable; 

@DynamoDBTable(tableName="my_table") 
public class MyClass { 
    private String uuid; 
    private MyMapClass myMap; 

    @DynamoDBHashKey(attributeName="uuid") 
    public String getUuid() { 
     return uuid; 
    } 
    public void setUuid(String uuid) { 
     this.uuid = uuid; 
    } 

    @DynamoDBAttribute(attributeName = "my_map")  
    public MyMapClass getMyMap() { 
     return myMap; 
    } 
    public void setMyMap(MyMapClass myMap) { 
     this.myMap = myMap; 
    }  
} 

und die zweite - für das my_map Feld:

import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBAttribute; 
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBDocument; 


@DynamoDBDocument 
public class MyMapClass { 
    private int field1; 
    private int field2; 

    @DynamoDBAttribute(attributeName = "field1")  
    public int getField1() { 
     return field1; 
    } 
    public void setField1(int field1) { 
     this.field1 = field1; 
    } 

    @DynamoDBAttribute(attributeName = "field2")  
    public int getField2() { 
     return field2; 
    } 
    public void setField2(int field2) { 
     this.field2 = field2; 
    } 
} 

Hier ist ein Anwendungsbeispiel:

... 
DynamoDBMapper dbMapper = new DynamoDBMapper(dbClient); 
... 
MyClass item = new MyClass(); 
item.setUuid("52f9d257-7998-4379-928b-9d41d70dd8a8"); 
MyMapClass map = new MyMapClass(); 
map.setField1(123); 
map.setField2(456); 
item.setMyMap(map); 
dbMapper.save(item); 

hoffe, das hilft!

0

Ein bisschen alt, aber ich denke, es wert, meine Erfahrung hier zu beantworten. Was ich mit DynamoDB Map festgestellt habe, ist, dass es Map mit String als Schlüssel unterstützt. Also, wenn Sie es arbeitet (mit Wandlungs- Schema als ConversionSchemas.V2 soll Karte haben als here erklärt (im Grunde Ihre DynamoDB Mapper wie unten erstellen -

DynamoDBMapper dbMapper = new DynamoDBMapper(dbClient, DynamoDBMapperConfig.DEFAULT); 

nun diese Karte des Wert Teil unterstützter DynamoDB Datentyp sein sollte Auch das bedeutet, dass es Zahlen, Strings usw. haben kann.

Wenn Sie keinen Schlüssel (und/und Wert) als String haben, müssen Sie Ihre eigenen Konverter schreiben. Hier ist das Beispiel meines Konverters, den ich für LocalDate mit der Verwendung von Map als Schlüssel verwendet habe.

public class LocalDateMapConverter implements DynamoDBTypeConverter< Map<String, Long>, Map<LocalDate, Long>> { 
@Override 
public Map<String, Long> convert(Map<LocalDate, Long> localDateToStringMap) { 
    return localDateToStringMap.entrySet() 
      .stream() 
      .collect(toMap(k -> k.getKey().toString(), 
        Map.Entry::getValue)); 
} 

@Override 
public Map<LocalDate, Long> unconvert(Map<String, Long> stringToLocalDateMap) { 
    return stringToLocalDateMap.entrySet() 
      .stream() 
      .collect(toMap(k -> LocalDate.parse(k.getKey()), 
        Map.Entry::getValue)); 
} 
} 



@DynamoDBTable(tableName = "someTable") 
public class SomeTable { 

@DynamoDBHashKey(attributeName = "someKey") 
    private String key; 

@DynamoDBAttribute(attributeName = "someMapName") 
    @DynamoDBTypeConverted(converter = LocalDateMapConverter.class) 
    private Map<LocalDate, Long> someMap; 

} 

Hoffe, das hilft.