web-dev-qa-db-ja.com

dynamodb Localのグローバルセカンダリインデックスのクエリ

ドキュメントに従って、これらのパラメーターを使用して、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つ以上のパラメーター値が無効でした:条件パラメータータイプがスキーマタイプと一致しません」

ドキュメントでは、プライマリKeyTypeHASHまたはRANGEのいずれかであり、AttributeTypeAttributeDefinitionsを設定することを指定しています。フィールド。 publisherIdStringとして送信していますが、ここに何が欠けているのかわかりません。

問題はテーブルの作成方法にあるのでしょうか、それともクエリの方法にあるのでしょうか?ありがとう

21
Stelios Savva

これを変更してみてください

{ 
 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日間を費やしました。誤解を招くような公式文書。

70
gior91

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の単純なキー値マップを提供できます。

11
TheWebweiser

前述したように、型キャストを抽象化する場合は、DynamoDBドキュメントクライアントを使用する必要があります。

var docClient = new AWS.DynamoDB.DocumentClient();

...次に、上記のオブジェクト表記を使用してAPIを呼び出すことができます。

{ ':pub_id': '700'}

自分でこの問題にぶつかったので、いくつかの場所でDynamoDB()を使用し、他の場所でdocClientを使用していましたが、しばらくは理解できませんでしたが、それで解決します。

5
AntonusMaximus