Amazon DynamoDB テーブルに GetItem リクエストを実行しようとすると、次のエラーが発生します: "provided key element does not match the schema"
簡単な説明
このエラーは、次の原因で発生する場合があります。
- キーに間違ったデータ型を指定した。
- 属性の名前が誤っている。
- キーの一部のみを指定した。
- データが誤ったテーブルに書き込まれている。
- 不必要な追加キーがある。
- GetItem リクエストを実行して、1 つのアイテムではなく、広範にアイテムを取得しようとしている。
- テーブルには複合プライマリキーがあり、GetItem リクエストの実行時、パーティションキーとソートキーを指定していない。
- テーブルにはソートキーがなく、GetItem リクエストの実行時にパーティションキーのみを指定している。
解決方法
プライマリキーとソートキーのデータタイプを確認する
GetItem コマンドを正常に実行するには、プライマリキーとソートキーのデータが DynamoDB テーブルのデータと同じデータ型である必要があります。次のコマンド例では、ソートキー Year のデータ型は文字列 (S) です。
aws dynamodb get-item --table-name Key-Element --key '{"EventID":{"S":"test-item01"}, "Year":{"S":"2024"}}'
テーブルは数値 (N) データ型を使用していることが原因で、次のエラーメッセージが表示されます。
"An error occurred (ValidationException) when calling the GetItem operation: The provided key element does not match the schema"
代わりに、数値データ型を使用する次のコマンドを実行します。
aws dynamodb get-item --table-name Key-Element --key '{"EventID":{"S":"test-item01"}, "Year":{"N":"2024"}}'
次の例のような出力が表示されます。
{
"Item": {
"EventID": {
"S": "test-item01"
},
"Year": {
"N": "2024"
},
"Works?": {
"N": "1"
}
}
}
ユースケースに合った操作を選択する
BatchGetItem 操作または GetItem 操作を使用する
DynamoDB テーブルからデータを取得するには、Getitem 操作または BatchGetitem 操作を使用できます。GetItem 操作は、一度に 1 つのレコードを取得します。リクエストには、テーブルのキースキーマを含める必要があります。
BatchGetItem 操作では、パーティションキーのみを持つテーブルのパーティションキーを指定する必要があります。複合プライマリキーを持つテーブルでは、BatchGetItem を使用する場合、パーティションキーおよびソートキーを指定する必要があります。
Query 操作を使用する
ソートキーを指定せずにデータを取得するには、Query 操作を使用します。Query ではパーティションキーのみを指定してデータを取得できるため、複合プライマリキーを持つテーブルにはこの操作を使用してください。
DynamoDB Scan API を使用する
キー以外の属性に基づいてデータを検索するには、DynamoDB Scan API を使用します。Scan 操作では、プライマリキーを指定する必要がなく、FilterExpression を使用することで、任意の属性に基づいてデータをフィルター処理できます。
キー以外の属性を使用してデータを検索するには、FilterExpression 内でネスト検索を使用します。たとえば、ネストされた Data 属性に userId 属性があり、特定の値と一致する項目を検索するには、次の式を使用します。
"Data.userId": your_expression_values."
重要: Scan 操作は、フィルター条件が満たされているかどうかを確認するためにすべての項目に対して繰り返されるため、この操作では料金が急増する可能性があります。Scan 操作を使用する必要がある場合は、大きなテーブルをスキャンするときにはページ区切りを追加してください。Scan API は、1 回の呼び出しで最大 1 MB のデータのみを返します。新しいデータのみをスキャンするには、ページ区切りを使用してください。