我有一个DynamoDB表,用户,其文档结构类似于以下内容:
{
"id": "1",
"name": "john",
"hobbies": [
{
"description": "painting",
"skill": "amateur"
},
{
"description": "cooking",
"skill": "expert"
}
]
}
可以看出,文档结构包含一个列表属性,爱好,可以包含一些爱好“对象”。
我想编写一个更新语句,以便在列表属性中添加新元素(如果它尚不存在)。
例如,我希望能够将具有“设计”的“描述”和“业余”的“技能”的爱好传递给我的更新功能,并且因为这个爱好还没有列在爱好,它应该被添加到列表中。如果爱好已经存在,则不应再次添加。
我在Node.js工作,因此使用JavaScript和带有参数映射的AWS.DynamoDB.DocumentClient()来执行我的功能。 AWS documentation有帮助,但我正在努力寻找如何设置params以有条件地将项目附加到list属性的示例,正如我所描述的那样。有没有人对如何做到这一点有一些建议?
答案 0 :(得分:9)
您可以在list_append()
and if_not_exists()
中一起使用UpdateExpression附加到可能不存在的列表列,但如果已存在具有相同属性的对象,则无法阻止附加到该列表在列表中。
作为替代方案,您可以替换您的爱好"列出一个字符串集,每个只有JSON.stringify()
" hobbie"在插入之前(和JSON.parse()
在读取值时):
var AWS = require('aws-sdk')
var DB = new AWS.DynamoDB.DocumentClient()
var hobbieToAdd = JSON.stringify({
description: "designing",
skill: "amateur"
})
DB.update({
TableName: "TableName",
Key: { id: "1" },
UpdateExpression: "ADD #hobbies :hobbie",
ExpressionAttributeNames: { "#hobbies" : "hobbies" },
ExpressionAttributeValues: { ":hobbie": DB.createSet([hobbieToAdd]) }
})
使用字符串集将确保永远不会出现重复项,但它还要求您(自己)自己序列化爱好。