ハッシュキーではないフィールドに応じてアイテムを取得する方法はありますか?
例
マイテーブルユーザー:id (HashKey), name, email
そして、「[email protected]」として電子メールを持っているユーザーを取得したい
これをどのように行うことができますか?
私はボトでこれを試してください:
user = users.get_item(email='[email protected]')
次のエラーが表示されます。
'The provided key element does not match the schema'
ハッシュキーではないフィールドをクエリするには、グローバルセカンダリインデックス(GSI)を使用する必要があります。 GSIの詳細については、 this AWS Post をご覧ください。
2015年2月更新:GSIを既存のテーブルに追加できるようになりました。詳細については、 Amazon Docs を参照してください。
悲しいことに 既存のDynamoDBテーブルにGSIを追加することはできません ですので、これが本当にクエリが必要な場合は、新しいテーブルを作成してデータを移植する必要があります。
DynamoDB FAQ から:
Q:DynamoDBテーブルのグローバルセカンダリインデックスを作成するにはどうすればよいですか?
テーブルに関連付けられているすべてのGSIは、テーブル作成時に指定する必要があります。現時点では、テーブルの作成後にGSIを追加することはできません。テーブルとそのインデックスを作成する詳細な手順については、 here を参照してください。テーブルごとに最大 5つのグローバルセカンダリインデックス を作成できます。
データを移植したくない場合は、メインデータテーブルへのルックアップとして使用するハッシュキーと親レコードのハッシュとして電子メールを使用して2つ目のDynamoDBテーブルを作成することを検討できますが、これは想像できませんまさに最適なソリューションであり、マスターテーブルとの同期を維持するという頭痛の種です。
以下は、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)
});
整数ではなく文字列を送信しているときにもこのエラーが発生しました。
もちろん、これは私がデータベースから読み取るのではなく、データベースに書き込むときでした。
RANGEキーに@DynamoDBHashKey
アノテーションを使用していたため、Javaでこのエラーが発生しました。オブジェクトのIDに@DynamoDBRangeKey
アノテーションを使用する必要がありました。
Javaアプリケーションでこのエラーが発生しました。誤って2つのRangeキーに注釈が付けられていたためです(@DynamoDBRangeKey
)DAOクラスで、1つしかない場合。新しい追加の注釈を@DynamoDBAttribute
に変更し、それで解決しました。