我有一个DynamoDB表,用户,其文档结构类似于以下内容:
{ "id": "1", "name": "john", "hobbies": [ { "description": "painting", "skill": "amateur" }, { "description": "cooking", "skill": "expert" } ] }
可以看出,文档结构包含列表属性,爱好,可以包含业余爱好"对象"的集合.
我想编写一个更新语句,以便在列表属性中添加新元素(如果它尚不存在).
例如,我希望能够将具有"设计"的"描述"和"业余"的"技能"的爱好传递给我的更新功能,并且,因为这个爱好还没有出现在爱好列表中,所以应该添加到列表中.如果爱好已经存在,则不应再次添加.
我在Node.js工作,因此使用JavaScript和带有参数映射的AWS.DynamoDB.DocumentClient()来执行我的功能.该AWS文档是有帮助的,但我在努力寻找如何设置PARAMS有条件地追加项目的列表属性为我所描述的例子.有没有人对如何做到这一点有一些建议?
您可以在UpdateExpression中使用list_append()
和if_not_exists()
一起附加到可能不存在的列表列,但如果列表中已存在具有相同属性的对象,则无法阻止附加到该列表.
作为替代方案,您可以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]) } })
使用字符串集将确保永远不会出现重复项,但它还要求您(自己)自己序列化业余爱好.