web-dev-qa-db-ja.com

DynamoDb:同じハッシュキーを持つすべてのアイテムを削除する

次の表を検討してください。

Table (documentId : Hash Key, userId: Range Key)

同じdocumentIdを持つすべてのアイテムを削除するコードを、できればアイテムを取得せずに作成するにはどうすればよいですか。

12
Hans

現在、ハッシュキーを渡すだけではすべてのアイテムを削除できません。アイテムを削除するには、ハッシュ+範囲が必要です。

You have to know both your (hash + range) to delete the item. 

編集:これはDynamoDBドキュメントからの参照リンクです http://docs.aws.Amazon.com/amazondynamodb/latest/APIReference/API_DeleteItem.html#API_DeleteItem_RequestSyntax

アイテムを削除するにはハッシュ(パーティションキー)と範囲(ソートキー)の両方を渡す必要があることを明確に示している「キー」の説明をお読みください。

14
Harshal Bulsara

ハッシュキーのみで削除する場合は、最初にレコードをクエリしてから、batchDeleteを使用してすべてのレコードを削除する必要があります。

HashMap<String, AttributeValue> eav = new HashMap<String, AttributeValue>();
eav.put(":v1", new AttributeValue().withS(value));
DynamoDBQueryExpression<DocumentTable> queryExpression = new DynamoDBQueryExpression<DocumentTable>()
            .withKeyConditionExpression("documentId = :v1")
            .withExpressionAttributeValues(eav);
List<DocumentTable> ddbResults = dynamoDBMapper.query(DocumentTable.class, queryExpression);
dynamoDBMapper.batchDelete(ddbResults);

deleteItemは一度に1つのアイテムしか削除せず、ハッシュキーと範囲キーの両方を指定する必要があることをここで説明します。

2
alok698

DynamoDBテーブルから1000万行を超える行を削除する必要があるという同様の要件があります。特定のパーティションキーに基づいてすべてのアイテムを削除する方法があることを期待していましたが、残念ながら方法はありません(少なくとも見つかりませんでした)。

HashkeyとsortKeyの特定の値を指定するのは面倒です。唯一のオプションは、テーブルをスキャンして主キー(または複合キー)を取得し、それを繰り返し処理して、deleteItem APIを使用して単一のアイテムを削除することです。

BatchWriteItem AP​​Iを使用して、1回の呼び出しで最大25アイテム(最大400KB)を削除できます。

詳細については、AWSからこのAPIを参照できます。 https://docs.aws.Amazon.com/amazondynamodb/latest/APIReference/API_BatchWriteItem.html

1
Sagar Jani