web-dev-qa-db-ja.com

DynamoDB:指定されたキー要素がスキーマと一致しません

ハッシュキーではないフィールドに応じてアイテムを取得する方法はありますか?

マイテーブルユーザー:id (HashKey), name, email

そして、「[email protected]」として電子メールを持っているユーザーを取得したい

これをどのように行うことができますか?

私はボトでこれを試してください:

user = users.get_item(email='[email protected]')

次のエラーが表示されます。

'The provided key element does not match the schema'
29
user1635536

ハッシュキーではないフィールドをクエリするには、グローバルセカンダリインデックス(GSI)を使用する必要があります。 GSIの詳細については、 this AWS Post をご覧ください。

2015年2月更新:GSIを既存のテーブルに追加できるようになりました。詳細については、 Amazon Docs を参照してください。

悲しいことに 既存のDynamoDBテーブルにGSIを追加することはできません ですので、これが本当にクエリが必要な場合は、新しいテーブルを作成してデータを移植する必要があります。

DynamoDB FAQ から:

Q:DynamoDBテーブルのグローバルセカンダリインデックスを作成するにはどうすればよいですか?

テーブルに関連付けられているすべてのGSIは、テーブル作成時に指定する必要があります。現時点では、テーブルの作成後にGSIを追加することはできません。テーブルとそのインデックスを作成する詳細な手順については、 here を参照してください。テーブルごとに最大 5つのグローバルセカンダリインデックス を作成できます。

データを移植したくない場合は、メインデータテーブルへのルックアップとして使用するハッシュキーと親レコードのハッシュとして電子メールを使用して2つ目のDynamoDBテーブルを作成することを検討できますが、これは想像できませんまさに最適なソリューションであり、マスターテーブルとの同期を維持するという頭痛の種です。

11
Wolfwyrd

以下は、AWS Lambda環境のNode.js AWS SDKに適用されます:

これは私にとって大まかなものでした。 getItemメソッドを使用しようとしたときに、この問題に遭遇しました。何を試みても、このエラーは引き続き表示されます。最終的にAWSフォーラムで解決策を見つけました: https://forums.aws.Amazon.com/thread.jspa?threadID=20882

不可解なことに、明らかな解決策は、私が見つけることができるすべてのAWSドキュメントと矛盾しています。

ここに私のために働いたコードがあります:

var doc = require('dynamodb-doc');
var dynamo = new doc.DynamoDB();

var params = { }
params.TableName = "ExampleTable";
var key = { "ExampleHashKey": "1" };
params.Key = key;

dynamo.getItem(params, function(err, data) {
    if (err)
        console.log(err);
    else
        console.log(data)
});
23
Sean

整数ではなく文字列を送信しているときにもこのエラーが発生しました。

もちろん、これは私がデータベースから読み取るのではなく、データベースに書き込むときでした。

8

RANGEキーに@DynamoDBHashKeyアノテーションを使用していたため、Javaでこのエラーが発生しました。オブジェクトのIDに@DynamoDBRangeKeyアノテーションを使用する必要がありました。

1

Javaアプリケーションでこのエラーが発生しました。誤って2つのRangeキーに注釈が付けられていたためです(@DynamoDBRangeKey)DAOクラスで、1つしかない場合。新しい追加の注釈を@DynamoDBAttributeに変更し、それで解決しました。

0
Josh