AWS DynamoDB - 如果集合确实存在,如何向集合添加值,但如果集合不存在,则使用值创建集合?

时间:2017-02-08 01:46:18

标签: amazon-web-services amazon-dynamodb

我有一个用户表,有一个名为friends的属性,它将是所有用户朋友的id的一组。

最初,我尝试在创建用户时将friends属性实例化为空集,但是我收到一条错误,指出您不能拥有空属性。

因此,如果有人没有朋友,我能找到的唯一解决方案是读取用户的属性,如果不存在,则将属性设置为与他们正在添加的朋友的列表。如果确实存在,则只需使用ADD执行更新,这会将新朋友添加到集合中。

我不想为此进行两次AWS调用。

如果它不存在,有没有办法创建它,如果不存在,添加到它?

2 个答案:

答案 0 :(得分:8)

对于SET数据类型: -

  

ADD - 如果该属性尚不存在,则该属性及其值将添加到该项目中。如果属性确实存在,   那么ADD的行为取决于属性的数据类型:

     

如果现有数据类型是一个集合,并且Value也是一个集合,   然后将值添加到现有集合中。 (这是一套设定的操作,   不是数学加法。)例如,如果属性值是   设置[1,2],并指定ADD动作[3],然后是最终   属性值为[1,2,3]。如果添加操作,则会发生错误   为set属性指定并指定的属性类型   与现有的集类型不匹配。两套都必须相同   原始数据类型。例如,如果现有数据类型是一个集合   对于字符串,Value也必须是一组字符串。同样的   对于数字集和二进制集都是如此。

示例: -

首次更新: -

表中不存在country属性。 updateItem创建了新属性country,其中提供了值(IN,UK)。

var params = {
        TableName : "Movies",
        Key : {
            "yearkey" : 2014,
            "title" : "The Big New Movie 2"
        },
        UpdateExpression : "ADD country :countries",            
         ExpressionAttributeValues: {
                ':countries': docClient.createSet(["IN", "UK"])             
            },
        ReturnValues : "UPDATED_NEW"
    };

第二次更新: -

这一次updateItem添加了新值“US”并忽略了现有值“IN”。

var params = {
        TableName : "Movies",
        Key : {
            "yearkey" : 2014,
            "title" : "The Big New Movie 2"
        },
        UpdateExpression : "ADD country :countries",            
         ExpressionAttributeValues: {
                ':countries': docClient.createSet(["IN", "US"])             
            },
        ReturnValues : "UPDATED_NEW"
    };

答案 1 :(得分:1)

以下是使用aws命令行的示例。

aws dynamodb update-item --table-name users \
--key '{"userId": {"S": "my-user-id"}}' \ 
--update-expression "ADD friends :friends" \
--expression-attribute-values '{":friends": {"SS": ["friend1-id", "friend2-id"]}}'
  • SS表示一组字符串(不允许重复)。
  • 对于不存在的情况,无需在SET中使用update-expressionADD将处理它。

请参见aws docs here