web-dev-qa-db-fra.com

Interrogation d'un index secondaire global dans dynamodb Local

Je crée une table et GSI dans DynamoDB, en utilisant ces paramètres, selon la documentation:

configId est la clé primaire de la table, et j'utilise le publisherId comme clé primaire pour le GSI. (J'ai supprimé certains paramètres de configuration inutiles par souci de concision)

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',
                }
            ]
        }
    ]
};

J'interroge ce tableau en utilisant ceci:

{ TableName: 'Configs',
  IndexName: 'publisher_index',
  KeyConditionExpression: 'publisherId = :pub_id',
  ExpressionAttributeValues: { ':pub_id': { S: '700' } } }

mais je reçois toujours l'erreur:

"ValidationException: une ou plusieurs valeurs de paramètre n'étaient pas valides: le type de paramètre de condition ne correspond pas au type de schéma"

Dans les documents, il spécifie que le KeyType principal peut être HASH ou RANGE, et que vous définissez le AttributeType dans le AttributeDefinitions champ. J'envoie le publisherId en tant que String, je ne sais pas ce qui me manque ici.

Le problème se pose-t-il dans la façon dont je crée la table ou dans la façon dont j'interroge? Merci

21
Stelios Savva

Essayez de changer cela

{ 
 TableName: 'Configs',
 IndexName: 'publisher_index',
 KeyConditionExpression: 'publisherId = :pub_id',
 ExpressionAttributeValues: { ':pub_id': { S: '700' } } 
}

dans ce

{ 
 TableName: 'Configs',
 IndexName: 'publisher_index',
 KeyConditionExpression: 'publisherId = :pub_id',
 ExpressionAttributeValues: { ':pub_id': '700'} 
}

De { ':pub_id': { S: '700' } } à { ':pub_id': '700'}.

J'ai eu le même problème et j'ai passé 2 jours pour ça. La documentation officielle trompeuse.

70
gior91

Il s'avère que cela dépend si vous utilisez AWS.DynamoDB ou AWS.DynamoDB.DocumentClient.

Vérifiez la différence dans la documentation: AWS.DynamoDB.query vs AWS.DynamoDB.DocumentClient.query

Dans le DocumentClient, le document indique clairement:

Le client de document simplifie le travail avec les éléments dans Amazon DynamoDB en faisant abstraction de la notion de valeurs d'attribut. Cette abstraction annote les types JavaScript natifs fournis en tant que paramètres d'entrée, ainsi que convertit les données de réponse annotées en types JavaScript natifs.

...

Fournissez les mêmes paramètres que AWS.DynamoDB.query () avec AttributeValues ​​substitué par des types JavaScript natifs.

Peut-être que vous faites également référence à DynamoDB API Reference qui, en fait, ne fait aucune hypothèse sur le SDK utilisé mais utilise des requêtes HTTP simples dans les exemples.

Ainsi, en utilisant le AWS.DynamoDB.DocumentClient vous fourniriez simplement une mappe de valeurs-clés simple pour ExpressionAttributeValues comme suggéré par @ gior91.

11
TheWebweiser

Comme indiqué ci-dessus, vous devez utiliser DynamoDB Document Client si vous souhaitez retirer la conversion de type.

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

... alors vous pouvez simplement utiliser la notation d'objet ci-dessus pour appeler l'API.

{ ':pub_id': '700'}

Je me suis intéressé à ce problème, j'utilisais DynamoDB () à certains endroits et le docClient à d'autres, je ne pouvais pas le comprendre pendant un certain temps, mais cela le résoudrait.

5
AntonusMaximus