AWS DynamoDB Transact Write с использованием оператора IN на массиве - PullRequest
0 голосов
/ 20 апреля 2020

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

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

Но у меня возникают трудности с поиском примеров или документов, связанных с тем, как использовать оператор IN для идентификаторов, которые являются первичными ключами в параметре Key в 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
                        }
                    }
                }]
            }

Уже попробовал: Ответ Это не тот же вопрос, что и у меня

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

1 Ответ

1 голос
/ 20 апреля 2020

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

Чтобы обновить более одного элемента по идентификатору, вы можете поместить много объектов Update в 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()
...