web-dev-qa-db-ja.com

DynamoDB:ネストされたJSON構造を持つテーブルを作成するにはどうすればよいですか?

以下の構造でdynamoDBにテーブルを作成したいのですが。

{
  "CartId": 123,
  "UserId": 356,
  "CartItems": [
    {
      "ProductId": 100,
      "Quantity": 50
    },
    {
      "ProductId": 121,
      "Quantity": 51
    }
  ]
}

チュートリアルとドキュメントのどこにでも、テーブルには以下のタイプの属性しか含めることができないと書かれています。

  1. 文字列のセット

  2. 数のセット

  3. バイナリのセット

上記の構造をDynamoDBに保存する方法は考えられません。手伝ってもらえますか?

JavaのオブジェクトマッパーAPIを使っています。この特定のテーブル構造にマップできるクラスを作成する方法も教えていただければ幸いです。

11
Amit

最も簡単な方法は_@DynamoDBDocument_を使用することです

  1. Maven依存関係を追加する

    _<dependency>
            <groupId>com.amazonaws</groupId>
            <artifactId>aws-Java-sdk-dynamodb</artifactId>
            <version>1.11.186</version>
    </dependency>
    _
  2. 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;
    }
    _
  3. リポジトリを作成する

    _@EnableScan
    public interface CustomerRepository extends CrudRepository<Customer,String>
    _

    次にcustomerRepository.save(customer)を呼び出します。結果は次のようになります。

    _{
      "firstName": "Test",
      "fooList": [
        {
          "name": "foo"
        },
        {
          "name": "foo2"
        }
      ],
      "id": "e57dd681-8608-4712-a39a-f3e0f31a5e27",
     ]
    }
    _
13
sendon1982

解決策を見つけるのが簡単だとは思わなかったので、古い質問に投稿します。これが誰かを助けることを願っています。

ステップ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

4
Laura

JSONをDynamodbに文字列として保存できます。それはすべて、データをどのように処理するか、およびデータを取得する方法によって異なります。

DynamoDB Java APIは、すべてのJavaオブジェクトを文字列に変換するMarshallerオブジェクトを導入しているので、DynamoDB属性から保存して自動的にフェッチできます。

1
Chen Harel

パーティーに少し遅れましたが、これを共有したいと思います。以下のように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"
                }
            }
        }]
    }]
}

Dynamo DB-Snapに保存されているとおり

0

この質問が出されたときにこれらのデータ型が利用可能であったかどうかはわかりません(そうでない可能性が高いです)。最近では、CartItemsにListデータ型を使用し、各カートアイテムはMapのものになります。データ・タイプ。

リファレンス: DynamoDBデータ型

0
golem