2

我正在使用JSON结构来存储某个人的详细信息。基本上名称,电话,registeredTimestamp等,将是其他属性,主键将是电子邮件地址。使用NodeJS将新对象追加到DynamoDB中的JSON数组中

markedLocations,visitedLocations,searchHistory和recommendation是AWS调用它时的列表或Map。它将包含许多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" 
    } 
] 

代码/ 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} 
    }; 

我查 -

  • 在DynamoDB我怎么使用元素添加到列表场Java link

  • 正在更新一个JSON数组中的AWS dynamoDB

  • 更新一组DB迪纳摩使用节点的js link

  • 如何更新使用的NodeJS dynamoDB项目? link

  • 并检查了AWS文档UpdateItem API。我没有发现任何与我的问题/疑问有关的事情。

请你能告诉我是否有方法可以在NodeJS中添加一个新的JSON对象的JSON数组?我不能继续如何实施。

OR

我应该建立单独的表为每个阵列和具有电子邮件作为主键和时间戳作为排序键和前进? PS:我是DynamoDB的新手,我之前和MongoDB一起工作过,并且有办法在那里使用JSON数组和对象。无法在此找到方法。

+1

你知道如何做到这一点的Javascript?这就是你如何去做的。 Node.JS使用Javascript。 –

+0

@RobertHarvey号我不知道如何解决JS中的这个问题。整个AWS文档都有使用Java,PHP和.Net的示例和API演示。我不确定要使用什么API或如何构建代码。我列出的StackOverflow问题根本没有答案,或者主要是替换现有的值。我需要追加到现有的数组。 – bozzmob

+1

这听起来像你正在试图找到一个API或库的地方为一个简单的操作,应该很容易在Javascript中完成。看看[这篇文章](http://stackoverflow.com/questions/4538269),特别是[这个答案](http://stackoverflow.com/a/4538314/102937)。你不需要NodeJS,Dynamo或其他任何东西来实现这一点。请注意,该帖子的作者犯了同样的错误; *你不需要jQuery来做这件事。* –

回答

8

使用list_append() and if_not_exists()一起在UpdateExpression追加到一个潜在的不存在的名单列:

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) 
+0

这正是我正在寻找的东西。将测试它并更新。非常感谢。 – bozzmob

+0

请你能告诉我什么属性类型应该用于数组中的每个对象?它应该是一个列表吗? – bozzmob

+1

@bozzmob如果您正在使用DocumentClient,就像我在回答中一样,那么您根本不需要关心DyanmoDB内部类型。 DocumentClient会将'markedLocations'列表中的每个项目内部转换为Map类型。所以'markedLocations'最终会成为地图列表。 – idbehold