2

マイドキュメント内のJSON配列を更新すると、このようになります:2016102973634-DF:はAWS DynamoDBの

{ 
    "data": { 
     "eventId": "20161029125458-df-d", 
     "name": "first", 
     "purpose": "test", 
     "location": "yokohama", 
     "dateArray": [], 
     "attendees": [ 
     { 
      "attendeeId": "2016102973634-df", 
      "attendeeName": "lakshman", 
      "personalizedDateSelection": {} 
     }, 
     { 
      "attendeeId": "2016102973634-tyyu", 
      "attendeeName": "diwaakar", 
      "personalizedDateSelection": {} 
     } 
     ] 
    } 
} 

言ってやるが、私はattendeeIdで出席者JSON配列を更新する必要があります。私はの更新と条件式を使って多くの方法を試しましたが、成功しませんでした。ここで

は私の試みです:

const params = { 
    TableName: "event", 
    Key: { 
    "eventId": eventId 
    }, 
    UpdateExpression: "SET attendees[???] = ", 
    ConditionExpression: attendees.attendeeId = "2016102973634-df", 
    ExpressionAttributeValues: { 
    ":attendee" : attendeeList 
    }, 
    ReturnValues: "ALL_NEW" 
}; 


dynamo.update(params, (err, data) => { 
    if (err) { 
    return reject(err); 
    } 
    console.log(data.Attributes); 
}); 

は、配列にJSONを更新するためのすべてのリソースが見つかりませんでした。

@ notionquestのコメントの後: - JsonMarshallerを使用していません。当初、私はこのような参加者フィールドに空の配列を追加しました:

{ 
    "eventId": "20161029125458-df-d", 
    "name": "first", 
    "purpose": "test", 
    "location": "yokohama", 
    "dateArray": [], 
    "attendees": [] 
} 

をしてから、新しい出席者は、私はこのような参加者プロパティに追加来るとき:あなたが持っているとして

const attendee = { 
    "attendeeName": "user1", 
    "personalizedDateSelection": {"today": "free"} 
} 
const attendeeList = [attendee]; 
const eventId = "20161029125458-df-d"; 


const params = { 
    TableName: "event", 
    Key: { 
    "eventId": eventId 
    }, 
    UpdateExpression: "SET attendees = list_append(attendees, :attendee)", 
    ExpressionAttributeValues: { 
    ":attendee" : attendeeList 
    }, 
    ReturnValues: "ALL_NEW" 
}; 


dynamo.update(params, (err, data) => { 
    if (err) { 
    return reject(err); 
    } 
    console.log("in update dynamo"); 
    console.log(data.Attributes); 
}); 

上記のスニペットに記載されているように、最初に空の[]配列を追加し、を使用しての新しい出席者を追加します。次に、配列内の特定のJSONを更新する方法を示します。あなたがそれが不可能だと言うなら、他に何を試みることができますか?

  1. 全JSONを取得します。

    は、私は、これは試してみてください。

  2. JSOnを操作し、nodeJSで必要なものを変更します。
  3. そして、新しいJSONをdynamoDBに更新します。
  4. しかしこれは、dynamoDBへの2回の呼び出しを消費します。これは非効率的です。

ラウンドウェイがありますか?

+0

JsonMarshallerを使用してDynamoDBにJSONとしてデータを保存しましたか?はいの場合、APIにJSONデータを更新するオプションはありません。 – notionquest

+0

@notionquest配列にJsonをどのように挿入したかで質問を更新しました。あなたの考えを知りたいですか? –

答えて

0

JSONアレイのクエリと更新に関する回答が見つかりませんでした。私はこれが、AWSがこれらの機能を許可しないという有益な動機かもしれないと思う。主キー以外の特定のIDを照会する必要がある場合は、費用対効果の高い2次索引を作成する必要があります。この二次索引コストは、dyn amoDBテーブルコストに追加されています。

、私はセカンダリインデックス上の余分なドルを支払うことをしたくなかったので、私は次のように私のDynamoDBのスキーマを変更:

{ 
    "data": { 
     "eventId": "20161029125458-df-d", 
     "name": "first", 
     "purpose": "test", 
     "location": "yokohama", 
     "dateArray": [], 
     "attendees": { 
     "2016102973634-df": { 
      "attendeeId": "2016102973634-df", 
      "attendeeName": "lakshman", 
      "personalizedDateSelection": {} 
     }, 
     "2016102973777-df": { 
      "attendeeId": "2016102973777-df", 
      "attendeeName": "ffff", 
      "personalizedDateSelection": {} 
     } 
     } 
    } 
} 

{}[]からの参加者を変更します。これにより、私は特定のクエリ出席者に柔軟に対応し、それに関連するJSON全体を変更することができます。これは冗長なステップですが、私は趣味プロジェクトに余計な費用をかけたくありません。

+1

入れ子になったjsonを更新するサンプルクエリを投稿してもらえますか? "attendees.2016102973634-df" jsonを更新するにはどうすればよいですか? 「attendees.2016102973634-df.attendeeName」を更新する方法 – manojpt