Javascript 使用NodeJS将新对象附加到DynamoDB中的JSON数组
我使用JSON结构来存储个人的详细信息。基本上,姓名、电话、registeredTimestamp等是其他属性,主键是电子邮件地址 标记位置、访问位置、搜索历史记录和推荐是AWS所称的列表或地图。它将包含许多JSON对象 JSON结构-Javascript 使用NodeJS将新对象附加到DynamoDB中的JSON数组,javascript,json,node.js,amazon-web-services,amazon-dynamodb,Javascript,Json,Node.js,Amazon Web Services,Amazon Dynamodb,我使用JSON结构来存储个人的详细信息。基本上,姓名、电话、registeredTimestamp等是其他属性,主键是电子邮件地址 标记位置、访问位置、搜索历史记录和推荐是AWS所称的列表或地图。它将包含许多JSON对象 JSON结构- { "name":"Mama Miya", "phone":"9383883223", "registeredTimestamp":"some-time", "lastActiveTimestamp":"some-time",
{
"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"
}
]
}
从应用程序中,如果用户访问一个新位置,我需要向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"
}
]
代码/模式-
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将元素附加到列表字段
- 在AWS dynamoDB中更新JSON数组
- 使用节点Js更新Dynamo db中的集合
- 如何使用nodejs更新dynamoDB中的项
- 并检查了AWS文档中的内容。我没有发现任何与我的问题/疑问有关的东西
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)
你知道如何用Javascript实现吗?你会这么做的。Node.JS使用Javascript。@RobertHarvey没有。我不知道如何用JS解决这个问题。整个AWS文档都有使用Java、PHP和.Net的示例和API演示。我不确定要使用什么API或如何构造代码。我列出的StackOverflow问题要么根本没有答案,要么主要是替换现有值。我需要附加到现有的数组中。听起来你好像在试图为一个简单的操作找到一个API或库,这个操作应该可以用Javascript轻松完成。看一看,尤其是。您不需要NodeJS、Dynamo或其他任何东西来完成此任务。注意那篇文章的作者犯了和你一样的错误;您也不需要jQuery来完成此操作。@RobertHarvey谢谢您纠正我的错误。但是,再次回到问题上来,假设我在DynamoDB中已经有两个数组中的对象(前面提到的object literal),那么我如何向它附加另一个对象呢?如何在DB上执行
拼接
或推送
操作?“这是不可能的,对吗?”罗伯塔维用图式结构更新了我的问题。这正是我一直在寻找的东西。将对其进行测试和更新。非常感谢。请告诉我数组中每个对象应该使用什么属性类型?它应该是一个列表吗?@bozzmob如果你像我在回答中那样使用DocumentClient,那么你根本不需要关心DyanmoDB内部类型。DocumentClient会在内部将markedLocations
列表中的每个项目强制转换为映射类型。因此,markedLocations
最终将成为一个地图列表。我没有意识到要附加的对象必须包装在一个数组中。它看起来更像是一个数组合并,而不是一个附加。合并意味着可以替换/覆盖“目标”数组中的值。这里的情况并非如此。我同意一个更好的术语可能是list\u concat
。但是在这两种情况下,该函数都将数组作为输入,这使得它比只附加单个项的函数更灵活。这样,如果要附加多个项,则可以在单个调用中而不是在多个调用中完成。