使用NodeJS将新对象附加到DynamoDB中的JSON数组

boz*_*mob 20 javascript json amazon-web-services node.js amazon-dynamodb

我使用JSON结构来存储一个人的详细信息.基本上名称,电话,registeredTimestamp等将是其他属性,主键将是电子邮件地址.

markedLocations,visitedLocations,searchHistory和recommended是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"
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

在应用程序中,如果用户访问新位置,我需要向markedLocations添加新的JSON对象.因此,标记的地点应该看起来像 -

"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"
    }
]
Run Code Online (Sandbox Code Playgroud)

代码/ Schema-

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}
    };
Run Code Online (Sandbox Code Playgroud)

我检查了 -

  • 在DynamoDB中,如何使用Java 链接将元素附加到列表字段

  • 在AWS dynamoDB 链接中更新JSON数组

  • 使用Node Js 链接更新Dynamo db中的Set

  • 如何使用nodejs更新dynamoDB中的项目?链接

  • 并检查了适用于UpdateItem API的 AWS文档.我没有发现任何与我的问题/疑问相关的内容.

请问您是否有办法在NodeJS中使用新的JSON对象附加JSON数组?我无法继续实施相同的方法.

要么

我应该为每个数组创建单独的表,并将电子邮件作为主键,时间戳作为排序键并继续?

PS:我是DynamoDB的新手,我之前使用过MongoDB,并且有很多方法可以使用JSON数组和对象.无法在这里找到方法.

idb*_*old 42

UpdateExpression中使用list_append()if_not_exists()一起追加到可能不存在的列表列:

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)
Run Code Online (Sandbox Code Playgroud)

  • 这正是我正在寻找的东西。将测试它并更新。非常感谢。 (2认同)
  • @bozzmob如果您像我在回答中那样使用DocumentClient,那么您根本不需要关心DyanmoDB内部类型。DocumentClient会在内部将“ markedLocations”列表中的每个项目都转换为Map类型。因此,“ markedLocations”最终将成为地图列表。 (2认同)