web-dev-qa-db-ja.com

NodeJSを使用してDynamoDBのJSON配列に新しいオブジェクトを追加する

JSON構造を使用して、個人の詳細を保管しています。基本的に、名前、電話番号、registeredTimestampなどがその他の属性になり、主キーはメールアドレスになります。

markLocations、visitedLocations、searchHistory、およびレコメンデーションは、AWSが呼び出すリストまたはマップです。多くのJSONオブジェクトが含まれます。

JSON構造-

{
    "name":"Mama Miya",
    "phone":"9383883223",
    "registeredTimestamp":"some-time",
    "lastActiveTimestamp":"some-time",
    "signinType":"facebook",
    "additionalSigninData":{
        "key1":"value1",
        "key2":"value2"
    },
    "markedLocations":[
        {
            "latitude":"77.33",
            "longitude":"12.33",
            "name":"Home",
            "description":"my new home",
            "placeid":"55334433",
            "image":"url/abc.png"
        }
    ]
}

アプリから、ユーザーが新しい場所にアクセスした場合、新しいJSONオブジェクトをmarkedLocationsに追加する必要があります。したがって、markedLocationsは次のようになります。

"markedLocations":[
    {
        "latitude":"77.33",
        "longitude":"12.33",
        "name":"Home",
        "description":"my new home",
        "placeid":"55334433",
        "image":"url/abc.png"
    },{
        "latitude":"22.11",
        "longitude":"22.55",
        "name":"Ocean",
        "description":"Ocean",
        "placeid":"32423423",
        "image":"url/icean.png"
    }
]

コード/スキーマ-

var item = {
        'email': {'S': req.body.email},
        'phone': {'S': req.body.phone},
        'registeredTimestamp': {'S': req.body.registeredTimestamp},
        'lastActiveTimestamp': {'S': req.body.lastActiveTimestamp},
        'signinType': {'S': req.body.signinType},
        'version': {'S': req.body.version},
        'markedLocations': {'L': req.body.markedLocations}
    };

私はチェックした -

  • DynamoDBでJava link を使用してリストフィールドに要素を追加する方法

  • aWS dynamoDBでのJSON配列の更新 link

  • Node Js link を使用してDynamo dbでセットを更新する

  • nodejsを使用してdynamoDBのアイテムを更新する方法 リンク

  • そして、AWSドキュメントで pdateItem API を確認しました。私の問題や疑問に関連するものは何も見つかりませんでした。

NodeJSでJSON配列に新しいJSONオブジェクトを追加する方法があるかどうか教えてください。これを実装する方法を進めることができません。

[〜#〜]または[〜#〜]

アレイごとに個別のテーブルを作成し、電子メールを主キー、タイムスタンプをソートキーとして使用して続行しますか?

PS:私はDynamoDBを初めて使用しました。以前にMongoDBを使用したことがあり、そこでJSON配列とオブジェクトを使用する方法があります。ここで方法を見つけることができません。

29
bozzmob

list_append()if_not_exists()pdateExpression で一緒に使用して、存在しない可能性のあるリスト列に追加します。

var AWS = require('aws-sdk')
var DB = new AWS.DynamoDB.DocumentClient()

function appendMarkedLocation (personId, location) {
  return DB.update({
    TableName: 'people',
    Key: { id: personId },
    ReturnValues: 'ALL_NEW',
    UpdateExpression: 'set #markedLocations = list_append(if_not_exists(#markedLocations, :empty_list), :location)',
    ExpressionAttributeNames: {
      '#markedLocations': 'markedLocations'
    },
    ExpressionAttributeValues: {
      ':location': [location],
      ':empty_list': []
    }
  }).promise()
}

appendMarkedLocation('somePeronId', {
  latitude: '22.11',
  longitude: '22.55',
  name: 'Ocean',
  description: 'Ocean',
  placeid: '32423423',
  image: 'url/icean.png'
}).then(console.log)
37
idbehold