以下の構造でdynamoDBにテーブルを作成したいのですが。
{
"CartId": 123,
"UserId": 356,
"CartItems": [
{
"ProductId": 100,
"Quantity": 50
},
{
"ProductId": 121,
"Quantity": 51
}
]
}
チュートリアルとドキュメントのどこにでも、テーブルには以下のタイプの属性しか含めることができないと書かれています。
文字列のセット
数のセット
バイナリのセット
上記の構造をDynamoDBに保存する方法は考えられません。手伝ってもらえますか?
JavaのオブジェクトマッパーAPIを使っています。この特定のテーブル構造にマップできるクラスを作成する方法も教えていただければ幸いです。
最も簡単な方法は_@DynamoDBDocument
_を使用することです
Maven依存関係を追加する
_<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-Java-sdk-dynamodb</artifactId>
<version>1.11.186</version>
</dependency>
_
POJOを作成する
_@DynamoDBTable(tableName = "Customer")
public class Customer
{
@DynamoDBHashKey
@DynamoDBAutoGeneratedKey
private String id;
private String firstName;
private List<Foo> fooList;
}
@DynamoDBDocument
public static class Foo {
private String name;
}
_
リポジトリを作成する
_@EnableScan
public interface CustomerRepository extends CrudRepository<Customer,String>
_
次にcustomerRepository.save(customer)
を呼び出します。結果は次のようになります。
_{
"firstName": "Test",
"fooList": [
{
"name": "foo"
},
{
"name": "foo2"
}
],
"id": "e57dd681-8608-4712-a39a-f3e0f31a5e27",
]
}
_
解決策を見つけるのが簡単だとは思わなかったので、古い質問に投稿します。これが誰かを助けることを願っています。
ステップ1:必要な構造を反映する複雑なJavaオブジェクトを作成します。
List<HashMap<String, Integer>> cartItems = new ArrayList<HashMap<String, Integer>>();
HashMap<String, Integer> item1 = new HashMap<String, Integer>();
item1.put("ProductId", 100);
item1.put("Quantity", 50);
cartItems.add(item1);
HashMap<String, Integer> item2 = new HashMap<String, Integer>();
item2.put("ProductId", 121);
item2.put("Quantity", 51);
cartItems.add(item2);
ステップ2:複雑なオブジェクトでDynamoDBアイテムを更新します。
私はヘルパーメソッドを使用しています:
private void updateAttribute(int id, String newAttribute, Object newValue){
Map<String, Object> newValues = new HashMap<String, Object>();
newValues.put(":value", newValue);
UpdateItemSpec updateItemSpec = new UpdateItemSpec()
.withPrimaryKey("id", id)
.withUpdateExpression("set " + newAttribute + " = :value")
.withValueMap(newValues);
siteTable.updateItem(updateItemSpec);
}
そしてこうして呼び出す:
updateAttribute(123, "CartItems", cartItems);
新しく追加されたカートアイテム属性は、次のようにDynamoDBに表示されます。
"CartItems": [
{
"ProductId": 100,
"Quantity": 50
},
{
"ProductId": 121,
"Quantity": 51
}
],
アップサートのシナリオはテストしていません。これまで、アップサート機能は存在していないようでした: https://forums.aws.Amazon.com/thread.jspa?threadID=162907
深くネストされたアイテムの読み取りについて: http://docs.aws.Amazon.com/amazondynamodb/latest/developerguide/Expressions.AccessingItemAttributes.html#DocumentPaths
JSONをDynamodbに文字列として保存できます。それはすべて、データをどのように処理するか、およびデータを取得する方法によって異なります。
DynamoDB Java APIは、すべてのJavaオブジェクトを文字列に変換するMarshallerオブジェクトを導入しているので、DynamoDB属性から保存して自動的にフェッチできます。
パーティーに少し遅れましたが、これを共有したいと思います。以下のようにcolumn属性をmy Java Entity。
@DynamoDBAttribute
@DynamoDBTypeConvertedJson
private List<Map<String,Object>> pageData;
入力Json:
{
"userId": 359628,
"platform": "learn-web",
"inactive_duration": 0,
"total_time": 15,
"device_type": "web",
"page_data": [{
"page_details": {
"page_type": "segmentView",
"time": 15,
"segment_id": 65590,
"session_id": 13140,
"module_id": 4363
},
"items": [{
"type": "component",
"id": 267307,
"sub_type": "video",
"time": 10,
"metadata": {
"lastPlaybackRate": 1,
"currentTime": 0,
"isLocked": false,
"video": {
"videoType": "BRIGHTCOVE",
"viewingTime": 156,
"videoSize": 7120441,
"url": "5378655747001",
"URL": "5378655747001"
}
}
}]
}]
}
この質問が出されたときにこれらのデータ型が利用可能であったかどうかはわかりません(そうでない可能性が高いです)。最近では、CartItems
にListデータ型を使用し、各カートアイテムはMapのものになります。データ・タイプ。
リファレンス: DynamoDBデータ型