web-dev-qa-db-fra.com

Erreur de requête Dynamodb - Condition de clé de requête non prise en charge

J'essaie d'interroger ma table dynamodb pour obtenir feed_guid et status_id = 1. Mais il renvoie une erreur de condition de clé de requête non prise en charge. Veuillez trouver mon schéma de table et ma requête.

$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
            )
        ));

Voici ma requête pour mettre à jour cette table.

 $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

Comme mentionné, l'attribut inclus dans "KeyConditionExpression" doit être votre clé de hachage uniquement, correspondant à votre schéma de table de base (dans ce cas 'feed_guid'). Si vous souhaitez interroger à la fois 'feed_guid' et 'status_id', vous devez créer la table avec le hachage et la clé de plage et spécifier 'status_id' comme clé de plage.

Les index secondaires globaux sont complètement séparés de la table de base, donc dans ce cas, vous pouvez interroger les index séparément (utilisez 'status_id' en condition clé lors de la requête StatusIndex et utilisez 'user_id' en condition clé lors de la requête UserIdIndex).

Veuillez trouver plus de détails sur l'interrogation des index secondaires globaux ici

10
Daniela Miao

Une autre option serait d'utiliser un FilterExpression en plus du KeyConditionExpression. Comme Daniela l'a mentionné, KeyConditionExpression ne doit contenir que des colonnes dans la clé de hachage. Mais toutes les colonnes non indexées peuvent être incluses dans FilterExpression.

0
Vasu Kargi