次のコードを使用してdynamodb
を照会しようとしています。
const AWS = require('aws-sdk');
let dynamo = new AWS.DynamoDB.DocumentClient({
service: new AWS.DynamoDB(
{
apiVersion: "2012-08-10",
region: "us-east-1"
}),
convertEmptyValues: true
});
dynamo.query({
TableName: "Jobs",
KeyConditionExpression: 'sstatus = :st',
ExpressionAttributeValues: {
':st': 'processing'
}
}, (err, resp) => {
console.log(err, resp);
});
これを実行すると、次のエラーが表示されます。
ValidationException: Query condition missed key schema element: id
ぜんぜんわかりません。 id
テーブルのパーティションキーとしてjobs
を定義しており、processing
ステータスにあるすべてのジョブを見つける必要があります。
主キーを含まない条件を使用してクエリを実行しようとしています。これは DynamoDBでのクエリの動作 です。 あなたのケースで情報をスキャンする を実行する必要がありますが、私はそれが最良の選択肢だとは思いません。
global secondary index を設定し、それを使用してprocessing
ステータスを照会したいと思います。
別の答え@ smcstewartがこの質問に答えました。しかし、彼はこのエラーが発生した理由をコメントする代わりにリンクを提供します。あなたの時間を節約することを期待して、簡単なコメントを追加したいと思います。
テーブルのクエリに関するAWSドキュメント は、DynamoDBの方法でWHERE
条件クエリ(たとえばSQL query SELECT * FROM Music WHERE Artist='No One You Know'
)を実行できるが、1つの重要な注意事項があることを示しています。
PARTITIONキーにはEQUALITY条件を指定する必要があり、オプションでSORTキーに別の条件を指定できます。
意味Query
でのみキー属性を使用できます。他の方法でそれを行うと、DynamoDBはフルスキャンを実行し、非効率的です-グローバルセカンダリインデックスを使用するよりも効率が劣ります。
したがって、クエリを使用して非キー属性を照会する必要がある場合、通常はオプションではありません-最良のオプションは、@ smcstewartが示唆するように Global Secondary Indexes を使用しています。
このガイド は、グローバルセカンダリインデックスを手動で作成するのに役立つことがわかりました。
CloudFormationを使用して追加する必要がある場合 関連ページはこちら 。