2016-10-06 7 views
0

現在、Dynamoに格納されているjsonオブジェクトのサブセットを取得できますか?私はダイナモでJSON形式でそれらを格納Dynamoに格納されているJSONオブジェクトのサブセットを取得する

records: 
[ 
    {"K1": "V1" }, 
    {"K2": "V2" }, 
    {"K3": "V3" }, 
    {"K4": "V4" } 
] 

:たとえば、私は、JSONオブジェクトの配列であるJSON形式の記録という名前の属性を持っています。私は第3と第4のものではなく、第1〜2のキーの値のペアだけを取り出すことができるかどうかを知りたがっていますか?この操作を行うために特定のフィルタ式を指定できるかどうかは不明です。

可能であれば、どのようにしてその方法を聞くのが大好きですか?

ありがとうございます!

+0

「records」属性のDynamoDBデータタイプとは何ですか?地図ですか? – notionquest

+0

私はgsonのようなものでシリアル化した後、jsonの文字列として2つのタイプを考えていました。 2番目のオプションは、シリアル化することですが、1つの文字列ではなくリストとして格納します。 – chrisrhyno2003

答えて

0

まず、DynamoDBにはJSONデータ型がありません。データがDynamoDBデータタイプMAPとして保存されている場合は、以下の解決策が有効です。要するに

、フィルタ式は以下のようなものでなければなりません: - あなたは出力にのみ「records.K1」と「records.K2」を持っている必要がある場合は、あなたのために、プロジェクトの表現を使用することができます

FilterExpression : 'records.K1 = :recordsK1Value and records.K2 = :recordsK2Value' 

それ。

ProjectionExpression : 'records.K1, records.K2' 

全コード: - すべてのフィールドを持つ

public List<String> queryMoviesAndFilterByMapAttribute() { 

    List<String> moviesJsonList = new ArrayList<>(); 

    DynamoDB dynamoDB = new DynamoDB(dynamoDBClient); 

    Table table = dynamoDB.getTable("Movies"); 

    QuerySpec querySpec = new QuerySpec(); 

    querySpec.withKeyConditionExpression("yearkey = :yearval and title = :titleval") 
      //.withProjectionExpression("records.K1, records.K2") 
      .withFilterExpression("records.K1 = :recordsK1Value and records.K2 = :recordsK2Value").withValueMap(
        new ValueMap().withNumber(":yearval", 1991).withString(":titleval", "Movie with map attribute") 
          .withString(":recordsK1Value", "V1").withString(":recordsK2Value", "V2")); 

    IteratorSupport<Item, QueryOutcome> iterator = table.query(querySpec).iterator(); 

    while (iterator.hasNext()) { 
     Item movieItem = iterator.next(); 
     System.out.println("Movie data ====================>" + movieItem.toJSONPretty()); 
     moviesJsonList.add(movieItem.toJSON()); 
    } 

    return moviesJsonList; 

} 

サンプル出力(すなわち、プロジェクトの表現なし): - コメント解除後

Movie data ====================>{ 
    "yearkey" : 1991, 
    "records" : { 
    "K1" : "V1", 
    "K2" : "V2", 
    "K3" : "V3", 
    "K4" : "V4" 
    }, 
    "title" : "Movie with map attribute" 
} 

サンプル出力プロジェクト式: -

yearkey、title、K3、K4などの他のフィールドは出力されません。

Movie data ====================>{ 
    "records" : { 
    "K1" : "V1", 
    "K2" : "V2" 
    } 
} 
+0

このレスありがとうございました。これは本当に役立ちます。私は1つの質問があった。この実装はMap用です。同様のファッションのリストのサブセットを取得することは可能ですか?私はprojectionExpressionのキーが異なるという概念を推測していますか?私はその可能性があるだけを知りたいのですが、あなたがそれを完全に解決する手間をかけることは望ましくありません。ありがとうございました! – chrisrhyno2003

+0

はい、文字列値のリストであれば可能です。例: - FilterExpression: 'contains(records、:recordsK1Value)'、 ProjectionExpression: 'レコード[0]、レコード[1]'、 – notionquest

+0

助けてくれてありがとう! – chrisrhyno2003

関連する問題