2017-10-17 23 views
0

DynamoDBで部分的な更新を行うのに多くの問題があります。我々のデータはビット次のようになりますので、骨材の代わりに、エンティティを使用してのNoSQLのベストプラクティスを使用しようとDynamoDBテーブルを部分的に更新する方法は?

[ 
{ 
    "userLogin": { 
     "ipAddress": "123.222.121.1234", 
     "lastLogin": "2017-10-16T17:38:59.818Z", 
     "userAgent": "bob", 
     "geoLocation": "lat-121 long-312" 
    }, 
    "addresses": { 
     "billingAddress": { 
      "streetName": "york street", 
      "province": "ontario", 
      "city": "toronto", 
      "streetNumber": "18", 
      "postalCode": "m5a2v7" 
     }, 
     "businessAddress": { 
      "streetName": "york street", 
      "province": "ontario", 
      "city": "toronto", 
      "streetNumber": "18", 
      "postalCode": "m5a2v7" 
     }, 
     "mailingAddress": { 
      "streetName": "york street", 
      "province": "ontario", 
      "city": "toronto", 
      "streetNumber": "18", 
      "postalCode": "m5a2v7" 
     }, 
    }, 
    "paymentTransaction": { 
     "orderId": 5, 
     "amount": 75, 
     "transactionTimestamp": "2017-10-16T17:38:59.818Z" 
    }, 
    "userId": "00uc4sxyi7gfQoFum0h7", 
    "phoneNumbers": { 
     "workNumber": "647-123-1234", 
     "homeNumber": "647-321-4321" 
    }, 
    "userProfile": { 
     "role": "admin", 
     "verifiedTimeStamp": "2017-10-16T17:38:59.818Z", 
     "termsConditionTimeStamp": "2017-10-16T17:38:59.818Z", 
     "verified": "TRUE", 
     "createdTimeStamp": "2017-10-16T17:38:59.818Z", 
     "termsConditionVersion": "1.0", 
     "email": "[email protected]" 
    } 
} 

]

我々がやりたいすべてが体に要求を行うことです

PUT /api/user-profiles/00uc4sxyi7gfQoFum0h7 
body: { 
    "userLogin": { "lastLogin": "2017-12-16T17:38:59.818Z" } 
} 

このようにして、Userテーブルの1つの属性を更新します。

updateItem APIは、更新する前に更新する属性を定義する必要があるようですが、要求の本文に基づいてより柔軟で動的なものにしたいと考えています。

このスレッドはそれが不可能だと言うようだ:

How to update multiple items in a DynamoDB table at once

もしそうなら、DynamoDBの中のアイテムの中だけで部分的な属性オブジェクトを更新して行くための最善の方法は何ですか?

答えて

2

userLoginがマップタイプの場合は、lastLoginkeyの値を更新することができます。以下のコードではコードが役に立ちます。ここで列名はuserLogin、newKeyはlastLoginとなります。完全なコードスニペットは、あなたが更新したい正確にどの列(複数可)と鍵を知らなかった場合はどのようにこれを修正するだろうhere

UpdateItemSpec updateItemSpec = new UpdateItemSpec().withPrimaryKey(primaryKey,primaryKeyValue).withReturnValues(ReturnValue.ALL_NEW). 
     withUpdateExpression("set #columnName." + newKey + " = :columnValue"). 
     withNameMap(new NameMap().with("#columnName", updateColumn)). 
     withValueMap(new ValueMap().with(":columnValue", newValue)).withConditionExpression("attribute_exists("+ updateColumn +")"); 

table.updateItem(updateItemSpec); 
+0

を見つけることができますか? リクエストボディにフィールドが「x」個あるキーまたは複数のキーが含まれていた場合はどうなりますか? 私はあなたの答えと同じフォーマットを使用することを考えていますが、より多くの条件式とリクエストボディのある種のイテレータを使用して複数のキーをチェックして、より多くの更新操作をインスタンス化できます。それは正しいと思いますか? –

+1

はい、繰り返しを使用して複数のキーを更新することができます。 –

関連する問題