Ad

DynamoDb: UpdateExpression For Updating Arrays

Env: NodeJS service using aws-sdk for interacting with DynamoDb.

Problem: When I set an attribute of an item to an array, it is saved as a string. I expect x: ['1'] but I get x: '1'. I believe this is because I'm incorrectly writing my UpdateExpression/ExpressionAttributeValues.

Situation: I have a table with a field called users. Users is an array of uuids that can be updated. An example of an item in the table:

{ x_name: 'Hello',
  owner: '123456',
  x_uuid: '1357911',
  users: [] 
}

I want to update the users array with a user uuid. To my update function I pass through:

{ users: ['13245395'] }

The update function (data is { users: ['13245395'] }):

updateX(data, { x_uuid }) {
    if (!x_uuid) {
      throw new Error('No x_uuid supplied')
    }

    // new doc client
    const docClient = new AWS.DynamoDB.DocumentClient();

    var params = {
      TableName: this.table,
      Key: {
        'x_uuid': x_uuid
      },
      UpdateExpression: "set users = :users",
      ExpressionAttributeValues:{
          ":users": `${data.users}`
      },
      ReturnValues:"ALL_NEW"
    };

    return new Promise((resolve, reject) =>
      docClient.update(params, (error, x) => {
        return error ? reject(error) : resolve(x)
      })
    )
   }
}

The result I get is

{ x_name: 'Hello',
  owner: '123456',
  x_uuid: '1357911',
  users: '13245395'
}

but what I expected was:

{ x_name: 'Hello',
  owner: '123456',
  x_uuid: '1357911',
  users: ['13245395']
}

Previously tried:

  1. wrapping data.users in an array when creating params (works for the first id but the second id added gets appended to the same string as the first so it looks like ['123,456'] instead ['123', '456'].

    UpdateExpression: "set users = :users", ExpressionAttributeValues:{ ":users": [${data.users}] },

  2. Using the "L" and "S" data types to determine that it's an array of strings, i.e.

    UpdateExpression: "set users = :users", ExpressionAttributeValues:{ ":users": { "L": { "S":${data.users} } } },

Ad

Answer

You are converting your users array to a string

":users": `${data.users}`

Try

":users": data.users

This will set users to the array in data.users

Ad
source: stackoverflow.com
Ad