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

rya*_*anm 3 amazon-web-services amazon-dynamodb

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

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

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

我不想为此调用两次AWS.

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

not*_*est 10

对于SET数据类型: -

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

如果现有数据类型是集合,并且值也是集合,则将值添加到现有集合.(这是一个集合运算,而不是数学加法.)例如,如果属性值是集合[1,2],并且指定了ADD动作[3],那么最终属性值将是[1,2,3] ].如果为set属性指定了Add操作并且指定的属性类型与现有的set类型不匹配,则会发生错误.两个集必须具有相同的原始数据类型.例如,如果现有数据类型是一组字符串,则Value也必须是一组字符串.数字集和二进制集也是如此.

例:-

第一次更新: -

country属性不存在于表中.使用提供的值(IN,UK)updateItem创建了新属性country.

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"
    };
Run Code Online (Sandbox Code Playgroud)

第二次更新: -

这次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"
    };
Run Code Online (Sandbox Code Playgroud)