如何更新String Set(SS)类型的Dynamodb中的项目?

时间:2016-05-12 18:28:47

标签: node.js amazon-web-services amazon-dynamodb

我创建了一个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" ]
  }

如何更新字符串集类型的属性?

3 个答案:

答案 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();