web-dev-qa-db-ja.com

DynamoDBテーブルの複数のアイテムを一度に更新する方法

DynamoDBを使用していますが、複数のレコードの特定の属性を更新する必要があります。擬似言語で自分の要件を書いて、「update tablepersonsset relationshipStatus = 'married' where personKey IN(key1、 key2、key3、...) "(personKeyがDynamoDBテーブルのKEYであると仮定)。

言い換えれば、IN句を使用して更新を実行するか、それをバッチ更新と呼ぶことができます。 this リンクが見つかりました。これは、バッチ更新のような操作が存在するかどうかを明示的に尋ね、その答えは存在しないというものです。ただし、IN句には言及していません。 documentation は、IN句がConditionalExpressionsでサポートされていることを示しています(一度に100個の値を指定できます)。ただし、必須のKEY属性(単一の値が必要と思われる-間違っている可能性があります)を提供する必要があるため、このようなIN節が私の状況に適しているかどうかはわかりません。各更新の全表スキャン。

私の質問は、複数のDynamoDBレコードを同時に更新するにはどうすればよいですか?現時点では、各キーの更新ステートメントを1つずつ呼び出す必要がありそうです。

18
Stanley

ご指摘のとおり、DynamoDBはバッチ更新操作をサポートしていません。更新するすべてのレコードを照会し、キーを取得する必要があります。次に、そのリストをループして、各アイテムを1つずつ更新します。

25
Mark B

答えが出されてから変化したかどうかはわかりませんが、今は可能です

ドキュメントを参照してください: https://docs.aws.Amazon.com/amazondynamodb/latest/APIReference/API_BatchWriteItem.html

私はこれをjavascriptで使用しました(新しいブロックを必要な構造を持つオブジェクトの配列にマッピングします:

let params = {}
let tableName = 'Blocks';

params.RequestItems[tableName] = _.map(newBlocks, block => {
    return {
        PutRequest: {
            Item: {
                'org_id': orgId,
                'block_id': block.block_id,
                'block_text': block.block_text
            },
            ConditionExpression: 'org_id <> :orgId AND block_id <> :block_id',
            ExpressionAttributeValues: {
                ':orgId': orgId,
                ':block_id': block.block_id
            }
        }
    }
})

docClient.batchWrite(params, function(err, data) {
   .... and do stuff with the result

putsdeletesを混在させることもできます

そして、dynogelsを使用している場合(dynogelsのサポートのためにemを混合することはできませんが、更新のために行うことができます(舞台裏でputとしてbatchWrite関数にキャストするのでcreateを使用してください)

var item1 = {email: '[email protected]', name: 'Foo 1', age: 10};
var item2 = {email: '[email protected]', name: 'Foo 2', age: 20};
var item3 = {email: '[email protected]', name: 'Foo 3', age: 30};

Account.create([item1, item2, item3], function (err, acccounts) {
  console.log('created 3 accounts in DynamoDB', accounts);
});

DynamoDBの制限からこれに注意してください( ドキュメントから ):

BatchWriteItem操作は、1つ以上のテーブルの複数のアイテムを配置または削除します。 BatchWriteItemを1回呼び出すと、最大16 MBのデータを書き込むことができます。これには、最大25個のputまたはdelete要求を含めることができます。書き込まれる個々のアイテムは、最大400 KBです。

正しく覚えていれば、dynogelsはリクエストを25のチャックにチャンクしてから送信し、1つの約束でそれらを収集して返します(これは100%確実ではありませんが)-それ以外の場合、ラッパー関数は非常に簡単にアセンブルできます

5
Simon Dragsbæk