DynamoDB:如何附加到文档

时间:2017-01-24 13:43:50

标签: javascript node.js lambda amazon-dynamodb

我有一个DynamoDB表,用户,其文档结构类似于以下内容:

{
  "id": "1",
  "name": "john",
  "hobbies": [
    {
      "description": "painting",
      "skill": "amateur"
    },
    {
      "description": "cooking",
      "skill": "expert"
    }
  ]
}

可以看出,文档结构包含一个列表属性,爱好,可以包含一些爱好“对象”。

我想编写一个更新语句,以便在列表属性中添加新元素(如果它尚不存在)。

例如,我希望能够将具有“设计”的“描述”和“业余”的“技能”的爱好传递给我的更新功能,并且因为这个爱好还没有列在爱好,它应该被添加到列表中。如果爱好已经存在,则不应再次添加。

我在Node.js工作,因此使用JavaScript和带有参数映射的AWS.DynamoDB.DocumentClient()来执行我的功能。 AWS documentation有帮助,但我正在努力寻找如何设置params以有条件地将项目附加到list属性的示例,正​​如我所描述的那样。有没有人对如何做到这一点有一些建议?

1 个答案:

答案 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]) }
})

使用字符串集将确保永远不会出现重复项,但它还要求您(自己)自己序列化爱好。