ドキュメントに従って、これらのパラメーターを使用して、DynamoDBでテーブルとGSIを作成しています。
configId
はテーブルの主キーであり、publisherId
をGSIの主キーとして使用しています。 (簡潔にするために、不要な構成パラメーターをいくつか削除しました)
var params = {
TableName: 'Configs',
KeySchema: [
{
AttributeName: 'configId',
KeyType: 'HASH',
}
],
AttributeDefinitions: [
{
AttributeName: 'configId',
AttributeType: 'S',
},
{
AttributeName: 'publisherId',
AttributeType: 'S',
}
],
GlobalSecondaryIndexes: [
{
IndexName: 'publisher_index',
KeySchema: [
{
AttributeName: 'publisherId',
KeyType: 'HASH',
}
]
}
]
};
私はこれを使用してこのテーブルをクエリしています:
{ TableName: 'Configs',
IndexName: 'publisher_index',
KeyConditionExpression: 'publisherId = :pub_id',
ExpressionAttributeValues: { ':pub_id': { S: '700' } } }
しかし、私はエラーを取得し続けます:
「ValidationException:1つ以上のパラメーター値が無効でした:条件パラメータータイプがスキーマタイプと一致しません」
ドキュメントでは、プライマリKeyType
はHASH
またはRANGE
のいずれかであり、AttributeType
にAttributeDefinitions
を設定することを指定しています。フィールド。 publisherId
をString
として送信していますが、ここに何が欠けているのかわかりません。
問題はテーブルの作成方法にあるのでしょうか、それともクエリの方法にあるのでしょうか?ありがとう
これを変更してみてください
{
TableName: 'Configs',
IndexName: 'publisher_index',
KeyConditionExpression: 'publisherId = :pub_id',
ExpressionAttributeValues: { ':pub_id': { S: '700' } }
}
これで
{
TableName: 'Configs',
IndexName: 'publisher_index',
KeyConditionExpression: 'publisherId = :pub_id',
ExpressionAttributeValues: { ':pub_id': '700'}
}
{ ':pub_id': { S: '700' } }
から{ ':pub_id': '700'}
へ。
私は同じ問題を抱えていて、これに2日間を費やしました。誤解を招くような公式文書。
AWS.DynamoDB
を使用するかAWS.DynamoDB.DocumentClient
を使用するかによって異なります。
ドキュメントの違いを確認してください: AWS.DynamoDB.query vs. AWS.DynamoDB.DocumentClient.query
DocumentClientでは、ドキュメントには次のように明記されています。
ドキュメントクライアントは、属性値の概念を抽象化することにより、Amazon DynamoDBのアイテムの操作を簡素化します。この抽象化は、入力パラメーターとして提供されるネイティブJavaScriptタイプに注釈を付け、注釈付き応答データをネイティブJavaScriptタイプに変換します。
...
AWS.DynamoDB.query()と同じパラメーターを、ネイティブJavaScriptタイプで置換されたAttributeValuesで指定します。
DynamoDB APIリファレンス を参照している場合もあります。実際には、使用されているSDKについては想定していませんが、例では単純なHTTPリクエストを使用しています。
したがって、AWS.DynamoDB.DocumentClient
を使用すると、@ gior91で提案されているように、ExpressionAttributeValues
の単純なキー値マップを提供できます。
前述したように、型キャストを抽象化する場合は、DynamoDBドキュメントクライアントを使用する必要があります。
var docClient = new AWS.DynamoDB.DocumentClient();
...次に、上記のオブジェクト表記を使用してAPIを呼び出すことができます。
{ ':pub_id': '700'}
自分でこの問題にぶつかったので、いくつかの場所でDynamoDB()を使用し、他の場所でdocClientを使用していましたが、しばらくは理解できませんでしたが、それで解決します。