DynamoDb: UpdateExpression для обновления массивов - PullRequest
0 голосов
/ 29 октября 2018

Env: сервис NodeJS, использующий aws-sdk для взаимодействия с DynamoDb.

Проблема: когда я устанавливаю атрибут элемента в массив, он сохраняется как строка. Я ожидаю x: ['1'], но я получаю x: '1'. Я считаю, что это потому, что я неправильно пишу мои UpdateExpression / ExpressionAttributeValues.

Ситуация: у меня есть таблица с полем под названием «пользователи». Users - это массив UUID, которые могут быть обновлены. Пример элемента в таблице:

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

Я хочу обновить массив пользователей с помощью пользовательского uuid. К моей функции обновления я перехожу через:

{ users: ['13245395'] }

Функция обновления (данные: {пользователи: ['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)
      })
    )
   }
}

Результат, который я получаю

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

но я ожидал:

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

Ранее пробовал: 1) Обертывание data.users в массиве при создании параметров (работает для первого идентификатора, но второй добавленный идентификатор добавляется к той же строке, что и первый, так что он выглядит как ['123,456'] вместо ['123', '456' ].

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

2) Использование типов данных "L" и "S", чтобы определить, что это массив строк, т.е.

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

1 Ответ

0 голосов
/ 29 октября 2018

Вы конвертируете массив пользователей в строку

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

Попробуйте

":users": data.users

Это установит users для массива в data.users

...