How to update an item in Dynamodb of type String Set (SS)?

前端 未结 3 1117
佛祖请我去吃肉
佛祖请我去吃肉 2021-02-14 00:04

I have created a attribute of type String Set. When I create the Item and assign an attribute of type SS everything works. But when I try to update this attribute, the data type

相关标签:
3条回答
  • 2021-02-14 00:17

    This is an artifact of using the DocumentClient - StringSet is not a JSON type.

    The DocumentClient converts a StringSet to the Array native JavaScript type: https://github.com/aws/aws-sdk-js/blob/master/lib/dynamodb/converter.js#L61. Then the client serializes the native JavaScript Array as a DynamoDB List type: https://github.com/aws/aws-sdk-js/blob/master/lib/dynamodb/converter.js#L12.

    If you want to use the StringSet type, you can use the low-level API: https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB.html

    0 讨论(0)
  • 2021-02-14 00:23

    As of September 2015, there is a createSet function in the DocumentClient that you can use for this.

    UPDATE - added example

    I've modified your example code to use this function:

    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.)
    
    0 讨论(0)
  • 2021-02-14 00:27

    An alternative simpler syntax

    Upsert Item and Add "A" to set

    const documentClient = new AWS.DynamoDB.DocumentClient();
    await documentClient.update({
        TableName,
        Key: { hashKey, sortKey },
        AttributeUpdates: {
          'userIDs': {
            Action: 'ADD',
            Value: documentClient.createSet(['A' ])
          },
        },
      }).promise();
    

    Upsert Item and remove "A" from set

    await documentClient.update({
        TableName,
        Key: { hashKey, sortKey },
        AttributeUpdates: {
          'userIDs': {
            Action: 'DELTE',
            Value: documentClient.createSet(['A'])
          },
        },
      }).promise();
    
    • Update expression docs
    • documentClient.createSet
    • documentClient.update
    0 讨论(0)
提交回复
热议问题