發佈到一個老問題,因爲我不認爲解決的辦法也很容易找到。希望這可以幫助某人。
第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
}
],
我沒有測試了一個upsert場景。在過去,UPSERT功能似乎並不存在:https://forums.aws.amazon.com/thread.jspa?threadID=162907
關於讀取的深層嵌套項目:http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.AccessingItemAttributes.html#DocumentPaths
嘿非常感謝,你的建議解決了我的問題:)。我現在使用你指定的格式。另外,我的印象是HashKey應該是唯一的。感謝澄清。 – Amit 2014-10-01 23:57:31
相對於您的總數據集,Hashkey應該是唯一的。如果你只有五個用戶,但你有數百萬行,你將遭受性能損失。對於這個特定的用例,主哈希鍵是非唯一的。如果感興趣,您可以閱讀更多關於Amazon DynamoDB如何對數據進行性能分區的內容。 – kurtzbot 2014-10-02 15:19:28
這個答案是錯誤的。 DynamoDB表不能包含具有非唯一主鍵的項目,無論是簡單(僅分區鍵)還是複合(分區鍵和排序鍵)。 *分區密鑰=散列密鑰;排序鍵=範圍鍵 – golem 2016-12-05 01:33:38