2017-01-24 34 views
4

に値をリストに追加する方法:DynamoDBの:私は次のような文書構造を持つDynamoDBのテーブル、ユーザを、持っている文書

{ 
    "id": "1", 
    "name": "john", 
    "hobbies": [ 
    { 
     "description": "painting", 
     "skill": "amateur" 
    }, 
    { 
     "description": "cooking", 
     "skill": "expert" 
    } 
    ] 
} 

ように見ることができますが、文書構造は、リストの属性が含まれています 、趣味 "、"趣味のコレクションを含むことができる趣味。

リストアトリビュートに新しいエレメントを追加するための更新ステートメントがまだ存在しない場合は、それを書きたいと思います。

たとえば、「設計」の「説明」と「アマチュア」の「スキル」を持つ趣味を更新機能に渡すことができます。この趣味はまだリストには含まれていません趣味のリストに追加する必要があります。もし趣味が既にそこにあるならば、それはもう一度追加すべきではありません。

私はNode.jsで作業しています。したがって、JavaScriptとAWS.DynamoDB.DocumentClient()をパラメータマップとともに使用して自分の機能を実行しています。 AWS documentationは役に立ちましたが、私が説明しているように、リスト属性に項目を条件付きで追加するためにparamsを設定する方法の例を見つけるのには苦労しています。誰かがおそらくこれを行う方法に関するいくつかのアドバイスを持っていますか?

答えて

1

UpdateExpressionにはlist_append() and if_not_exists()を一緒に使用して、潜在的に存在しないリスト列に追加することはできますが、同じプロパティを持つオブジェクトがリスト内に既に存在する場合はそのリストに追加できません。 (バック値を読み出す場合JSON.parse()それをして)あなたは文字列を設定して、あなたの「趣味」のリストを交換し、ちょうどJSON.stringify()それぞれ「ホビー」を挿入する前に可能性の代替として

使用
var AWS = require('aws-sdk') 
var DB = new AWS.DynamoDB.DocumentClient() 
var hobbieToAdd = JSON.stringify({ 
    description: "designing", 
    skill: "amateur" 
}) 
DB.update({ 
    TableName: "TableName", 
    Key: { id: "1" }, 
    UpdateExpression: "ADD #hobbies :hobbie", 
    ExpressionAttributeNames: { "#hobbies" : "hobbies" }, 
    ExpressionAttributeValues: { ":hobbie": DB.createSet([hobbieToAdd]) } 
}) 

文字列セットは重複が現れないことを保証しますが、趣味を自分で直列化する必要もあります。

+0

これは便利です。ありがとうございます。文字列セットのアイデアは、私が考えることができるものです...このアプローチの問題点(別のユースケースでは、質問に言及していませんでした)では、ユーザーは趣味の1つを更新することもできます。たとえば、彼らは "絵画"の趣味を持っていて、彼らは "素人"ですが、しばらくすると、 "絵画"趣味のスキルレベルを "中間"に更新するかもしれません。そして、私は文字列セットがこの他のユースケースを複雑にすると思います。 – Stanley