我创建了一个String Set类型的属性。 当我创建创建项目并分配类型SS的属性时,一切正常。 但是当我尝试更新此属性时,数据类型会更改为列表(" L")。
我试试这个:
qw = new AWS.DynamoDB.DocumentClient();
var params = {
TableName : "myTable",
Key: {
"id": somekey
},
UpdateExpression: "set ssvar= :arrp",
ExpressionAttributeValues: {
":arrp": [ "test", "test2" ]
}
};
qw.update (etc.)
这会导致dynamodb中数据类型的更改,而不是字符串集我得到一个列表:
"ssvar": {
"L": [
{
"S": "test"
},
{
"S": "test2"
}
]
}
我尝试过各种各样的解决方案,但总是改变我的数据类型。
ExpressionAttributeValues: {
":arrp":
"SS": [ "test", "test2" ]
}
如何更新字符串集类型的属性?
答案 0 :(得分:12)
截至2015年9月,DocumentClient中有一个createSet
函数可供您使用。
更新 - 添加了示例
我修改了您的示例代码以使用此功能:
qw = new AWS.DynamoDB.DocumentClient();
var params = {
TableName : "myTable",
Key: {
"id": somekey
},
UpdateExpression: "set ssvar= :arrp",
ExpressionAttributeValues: {
":arrp": qw.createSet([ "test", "test2" ])
}
};
qw.update (etc.)
答案 1 :(得分:2)
这是使用DocumentClient的工件 - StringSet不是JSON类型。
DocumentClient将StringSet转换为Array本机JavaScript类型: https://github.com/aws/aws-sdk-js/blob/master/lib/dynamodb/converter.js#L61。然后,客户端将本机JavaScript数组序列化为DynamoDB列表类型:https://github.com/aws/aws-sdk-js/blob/master/lib/dynamodb/converter.js#L12。
如果要使用StringSet类型,可以使用低级API:https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB.html
答案 2 :(得分:1)
另一种更简单的语法
追加项目并添加“ A”进行设置
const documentClient = new AWS.DynamoDB.DocumentClient();
await documentClient.update({
TableName,
Key: { hashKey, sortKey },
AttributeUpdates: {
'userIDs': {
Action: 'ADD',
Value: documentClient.createSet(['A' ])
},
},
}).promise();
更新项目并从集合中删除“ A”
await documentClient.update({
TableName,
Key: { hashKey, sortKey },
AttributeUpdates: {
'userIDs': {
Action: 'DELTE',
Value: documentClient.createSet(['A'])
},
},
}).promise();