AWS DynamoDB Transact Write с использованием оператора IN в массиве

Я работаю над одним запросом, где мне нужно использовать TrasactWrite для DynamoDB и выполнить запрос на обновление одной из моих таблиц.

Сценарий: у меня есть массив уникальных идентификаторов, и мне нужно выполнить одну и ту же операцию обновления для каждого идентификатора в массиве и изменить один флаг в таблице без использования цикла или карты.

Но мне трудно найти пример или документы, связанные с тем, как использовать оператор IN для идентификаторов, которые являются первичными ключами в ключевом параметре transactWrite.

Вот мой пример кода:

let IDs = await find('table', { type: 'some_type' }, 'type-index}
let params = {
                TransactItems: [{
                    Update: {
                        TableName: 'table',
                        Key: '#_id IN :IDs,
                        UpdateExpression: 'set #flag = :flag',
                        ExpressionAttributeNames: {
                            '#flag': 'flag',
                            '#_id': '_id'
                        },
                        ExpressionAttributeValues: {
                            ':flag': false,
                            ":IDs": IDs
                        }
                    }
                }]
            }

Уже пробовал: Ответ Это не тот же вопрос Как мой

Отвечу, если у кого возникнут вопросы. Любая помощь будет действительно полезной. Спасибо


person K P    schedule 20.04.2020    source источник


Ответы (1)


Вы не можете использовать оператор IN в этом случае - Update. С помощью оператора update вы должны поместить значение ключа в объект Update. Ключ включает в себя partitionKey и sortKey, я думаю, в вашем случае вы просто установили partitionKey.

Чтобы обновить более одного элемента по идентификатору, вы можете поместить несколько объектов обновления в TransactItems.

let IDs = await find('table', { type: 'some_type' }, 'type-index');

let params = {
  TransactItems: [], // init empty array
}

IDs.forEach((ID) => {// loop though IDs array
  params.TransactItems.push({
    Update: {
      TableName: 'table',
      Key: {
        '_id': ID, // ID value
      },
      UpdateExpression: 'set #flag = :flag',
      ExpressionAttributeNames: {
        '#flag': 'flag',
        // '#_id': '_id' // remove this line
      },
      ExpressionAttributeValues: {
        ':flag': false,
        // ":IDs": IDs // remove this line
      }
    }
  })
});
// await client.transactWrite(params).promise()
person hoangdv    schedule 20.04.2020
comment
Спасибо за ответ. хотя мне не разрешено использовать циклы, теперь я знаю, что это невозможно так, как я хочу. мы придумаем что-нибудь еще. - person K P; 22.04.2020