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
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.
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.
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.