2016-10-06 18 views
0

當前是否可以檢索存儲在Dynamo中的json對象的子集?例如,我有JSON類型的命名記錄屬性是JSON對象的數組:檢索存儲在Dynamo中的JSON對象的子集

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

我將它們存儲在發電機中的JSON格式。我想知道我是否只能檢索關鍵值對1到2,而不是第三和第四個關鍵值對?我不確定是否可以提供特定的過濾器表達式來執行此操作。

如果可能的話,我很樂意聽到關於如何完成的方法。

謝謝!

+0

什麼是「records」屬性的DynamoDB數據類型?它是地圖嗎? – notionquest

+0

我想到了兩種類型 - 一種是像gson之類的序列化後的json字符串。第二種選擇是將其序列化,但將其存儲爲列表而不是單個字符串。 – chrisrhyno2003

回答

0

首先,DynamoDB中沒有JSON數據類型。如果您的意思是數據存儲爲DynamoDB數據類型MAP,那麼以下解決方案應該適合您。

總之,過濾表達式應該是象下面這樣: -

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

如果您需要在輸出到只有「records.K1」和「records.K2」,您可以使用項目的表達式那。

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

非常感謝你的迴應。這真的有幫助。我有一個問題,但。這個實現是針對Map的。是否有可能檢索一個類似時尚列表的子集?我猜猜投影表達式中的鍵的概念會有所不同?我只想知道它是否可能,不想讓你完全解決它的麻煩。謝謝! – chrisrhyno2003

+0

是的,只要它是字符串值列表就可以。示例: - FilterExpression:'contains(records,:recordsK1Value)', ProjectionExpression:'records [0],records [1]', – notionquest

+0

太棒了!十分感謝你的幫助! – chrisrhyno2003