web-dev-qa-db-ja.com

Dynamodbクエリエラー-クエリキーの条件はサポートされていません

Feed_guidとstatus_id = 1を取得するためにdynamodbテーブルをクエリしようとしていますが、クエリキーの条件がサポートされていませんというエラーが返されます。テーブルスキーマとクエリを見つけてください。

$result =$dynamodbClient->createTable(array(
            'TableName' => 'feed',
            'AttributeDefinitions' => array(
                array('AttributeName' => 'user_id', 'AttributeType' => 'S'),
                array('AttributeName' => 'feed_guid',    'AttributeType' => 'S'),
                array('AttributeName' => 'status_id',  'AttributeType' => 'N'),
            ),
            'KeySchema' => array(
                array('AttributeName' => 'feed_guid', 'KeyType' => 'HASH'),
            ),

            'GlobalSecondaryIndexes' => array(
                array(
                    'IndexName' => 'StatusIndex',
                    'ProvisionedThroughput' => array (
                        'ReadCapacityUnits' => 5,
                        'WriteCapacityUnits' => 5
                    ),
                    'KeySchema' => array(
                        array(
                            'AttributeName' => 'status_id',
                            'KeyType' => 'HASH'
                        ),
                    ),
                    'Projection' => array(
                        'ProjectionType' => 'ALL'
                    )
                ),

                array(
                    'IndexName' => 'UserIdIndex',
                    'ProvisionedThroughput' => array (
                        'ReadCapacityUnits' => 5,
                        'WriteCapacityUnits' => 5
                    ),
                    'KeySchema' => array(
                        array(
                            'AttributeName' => 'user_id',
                            'KeyType' => 'HASH'
                        ),
                    ),
                    'Projection' => array(
                        'ProjectionType' => 'ALL'
                    )
                )

            ),
            'ProvisionedThroughput' => array(
                'ReadCapacityUnits'  => 10,
                'WriteCapacityUnits' => 20
            )
        ));

以下は、そのテーブルを更新するためのクエリです。

 $result = $dynamodbClient->query(array(
            'TableName' => 'feed',
            'KeyConditionExpression' => 'feed_guid = :v_fid AND status_id = :v_sid ',
            'ExpressionAttributeValues' =>  array(
                ':v_fid' => array('S' => '71a27f0547cd5456d9ee7c181b6cb2f8'),
                ':v_sid' => array('N' => 1)
            ),
            'ConsistentRead' => false
        ));
13
Arun SS

前述のように、「KeyConditionExpression」に含まれる属性は、ベーステーブルスキーマ(この場合は 'feed_guid')と一致するハッシュキーのみにする必要があります。 「feed_guid」と「status_id」の両方でクエリを実行する場合は、ハッシュと範囲キーを使用してテーブルを作成し、「status_id」を範囲キーとして指定する必要があります。

グローバルセカンダリインデックスはベーステーブルから完全に分離されているため、この場合はインデックスを個別にクエリできます(StatusIndexをクエリするときにキー条件で 'status_id'を使用し、UserIdIndexをクエリするときにキー条件で 'user_id'を使用します)。

グローバルセカンダリインデックスのクエリに関する詳細をご覧ください こちら

10
Daniela Miao

別のオプションは、KeyConditionExpressionに加えてFilterExpressionを使用することです。 Danielaが述べたように、KeyConditionExpressionにはハッシュキーの列のみを含める必要があります。ただし、インデックス付けされていない列はFilterExpressionに含めることができます。

0
Vasu Kargi