web-dev-qa-db-ja.com

クエリ条件にキースキーマ要素がありません:検証エラー

次のコードを使用して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ステータスにあるすべてのジョブを見つける必要があります。

19
Suhail Gupta

主キーを含まない条件を使用してクエリを実行しようとしています。これは DynamoDBでのクエリの動作 です。 あなたのケースで情報をスキャンする を実行する必要がありますが、私はそれが最良の選択肢だとは思いません。

global secondary index を設定し、それを使用してprocessingステータスを照会したいと思います。

26
smcstewart

別の答え@ 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を使用して追加する必要がある場合 関連ページはこちら

3
Ula