2015-05-15 12 views
12

Yeni AWS DynamoDB document API, doğrudan temel JSON temsiline karşılık gelen 2 yeni veri türüne izin verir: Harita (aka JSON nesnesi) ve Liste (aka JSON dizisi). Bununla birlikte, bu veri türlerinin niteliklerini, bunları tamamen üzerine yazmadan güncelleştirmenin bir yolunu bulamıyorum. Buna karşılık, bir Sayı niteliği gibi bir şey yapabilirsiniz Java böylece, başka bir numara ekleyerek güncellenebilir:AWS DynamoDB belge API'sinde bir Harita veya Liste nasıl güncellenir?

new AttributeUpdate("Some numeric attribute").addNumeric(17); 

Benzer yapabilirsiniz Set veri türünde bir öznitelik için addElements. (Eski API'da, AttributeAction.ADD'yi her iki amaç için de kullanırsınız.)

Bir Harita veya Liste için, önceki değeri yerel olarak güncellemeniz gerektiği, ardından bu değer yerine PUT yerine, örneğin Java'da olduğu gibi görünecektir. :

List<String> list = item.getList("Some list attribute"); 
list.add("new element"); 
new AttributeUpdate("Some list attribute").put(list); 

Bu, çok daha az okunabilir ve bazı durumlarda çok daha az verimlidir.

Yani benim sorular şunlardır:

  1. önceki değerini üzerine yazmadan bir harita veya bir liste veri türünde bir öznitelik güncelleştirmek için bir yolu var mı? Örneğin, bir Listeye öğe eklemek veya bir öğeyi Haritaya yerleştirmek için?

  2. Java API'yi kullanarak nasıl uygularsınız?

  3. Gelecekte bunu destekleme planlarını biliyor musunuz? Aşağıdaki gibi kodla listeyi güncelleyebilir

    { 
        "hashkey": {"S" : "my_key"}, 
        "my_list" : {"L": 
         [{"N":"3"},{"N":"7"} ] 
    } 
    

    :

+1

nasıl bahsediyor yeni belgeler var öğeleri listelere eklemek; http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.UpdateExpressions.html#Expressions.UpdateExpressions.SET.UpdatingListElements –

cevap

10

listesiyle bir öğe Verilen örnek için UpdateItem API

yılında UpdateExpression bakmak Lütfen

UpdateItemRequest request = new UpdateItemRequest(); 
request.setTableName("myTableName"); 
request.setKey(Collections.singletonMap("hashkey", 
    new AttributeValue().withS("my_key"))); 
request.setUpdateExpression("list_append(:prepend_value, my_list)"); 
request.setExpressionAttributeValues(
    Collections.singletonMap(":prepend_value", 
     new AttributeValue().withN("1")) 
    ); 
dynamodb.updateItem(request);` 

Ayrıca list_daki argümanların sırasını ters çevirerek listeye ekleyebilirsiniz. İfadeyi ekle.

gibi bir ifade

: Bu da işe ifade özelliği ile bir araya JSON harita öğesini ele alacağını SET user.address.zipcode = :zip DynamoDB örnekler üzerinde {":zip" : {"N":"12345"}}

+0

Eklemekte olduğum değer kendi başına bir sayı yerine bir Harita ise, herhangi bir fikir Yukarıdaki örnekte, – PUG

+1

UpdateItemRequest, UpdateItemSpec – PUG

6

Base değerleri, (skala)

val updateItemSpec:UpdateItemSpec = new UpdateItemSpec() 
    .withPrimaryKey("hashkey", my_key) 
    .withUpdateExpression("set my_list = list_append(:prepend_value, my_list)") 
    .withValueMap(new ValueMap() 
     .withList(":prepend_value", "1")) 
    .withReturnValues(ReturnValue.UPDATED_NEW) 
println("Updating the item...") 
val outcome: UpdateItemOutcome = table.updateItem(updateItemSpec) 
println("UpdateItem succeeded:\n" + outcome.getItem.toJSONPretty) 
+0

ile değiştirilmiştir. Lütfen bu kodun soruyu nasıl yanıtladığına bakın (bu yanıt, Geç Yanıtlar yorum kuyruğundaydı). – JAL

+1

Yanıtın temelinde Ben Schwartz i Sadece Amazon'un örneklerinin gerçekleştirildiği şekilde çözümlenecek başka bir yol sağlamak için sadece wat –

İlgili konular