次の表を検討してください。
Table (documentId : Hash Key, userId: Range Key)
同じdocumentId
を持つすべてのアイテムを削除するコードを、できればアイテムを取得せずに作成するにはどうすればよいですか。
現在、ハッシュキーを渡すだけではすべてのアイテムを削除できません。アイテムを削除するには、ハッシュ+範囲が必要です。
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
アイテムを削除するにはハッシュ(パーティションキー)と範囲(ソートキー)の両方を渡す必要があることを明確に示している「キー」の説明をお読みください。
ハッシュキーのみで削除する場合は、最初にレコードをクエリしてから、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つのアイテムしか削除せず、ハッシュキーと範囲キーの両方を指定する必要があることをここで説明します。
DynamoDBテーブルから1000万行を超える行を削除する必要があるという同様の要件があります。特定のパーティションキーに基づいてすべてのアイテムを削除する方法があることを期待していましたが、残念ながら方法はありません(少なくとも見つかりませんでした)。
HashkeyとsortKeyの特定の値を指定するのは面倒です。唯一のオプションは、テーブルをスキャンして主キー(または複合キー)を取得し、それを繰り返し処理して、deleteItem APIを使用して単一のアイテムを削除することです。
BatchWriteItem
APIを使用して、1回の呼び出しで最大25アイテム(最大400KB)を削除できます。
詳細については、AWSからこのAPIを参照できます。 https://docs.aws.Amazon.com/amazondynamodb/latest/APIReference/API_BatchWriteItem.html