我有一个用户表,有一个名为friends的属性,它将是所有用户朋友的id的一组。
最初,我尝试在创建用户时将friends属性实例化为空集,但是我收到一条错误,指出您不能拥有空属性。
因此,如果有人没有朋友,我能找到的唯一解决方案是读取用户的属性,如果不存在,则将属性设置为与他们正在添加的朋友的列表。如果确实存在,则只需使用ADD执行更新,这会将新朋友添加到集合中。
我不想为此进行两次AWS调用。
如果它不存在,有没有办法创建它,如果不存在,添加到它?
答案 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-expression
; ADD
将处理它。请参见aws docs here。