J'ai besoin d'interroger une table DynamoDB avec une clé différente de sa clé primaire. J'ai essayé de créer un index secondaire global pour cela. Cependant, j'obtiens cette erreur: "condition de clé de requête non prise en charge dynamodb". En voyant quelques exemples, il semble que je ne puisse pas interroger par un index secondaire à moins que j'inclue également l'index/clé primaire, est-ce correct? Disons que je dois interroger tous les employés qui travaillent dans une certaine ville, puis-je le faire sans l'ID d'employé?
Informations mises à jour Peut-être que mon index n'est pas créé comme il se doit?
Informations sur la table:
GSI:
Lorsque je demande à partir du nœud, j'ai envoyé en paramètre la ville et le nom d'index:
const filter = { city: city};
return this.getRecordsFromDb(filter, { IndexName: "myIndexName" })
.then(records => __.head(records));
Remarque: - Comme vous n'avez pas fourni le code complet, il est difficile de simuler et d'identifier le problème. Cependant, j'ai créé les tables et index similaires. Ça fonctionne bien pour moi. Vous pouvez vous référer au code ci-dessous pour plus de détails.
Voici le script de création de table et interrogez l'index.
Vous pouvez modifier le nom de la table et le nom de l'index si nécessaire. J'ai suivi la même structure d'attributs clés que vous avez mentionnée sur le post.
Cela a été testé et fonctionne bien.
1) Créez la table 'city' avec l'index 'city_index': -
var params = {
TableName: 'city',
KeySchema: [ // The type of of schema. Must start with a HASH type, with an optional second RANGE.
{ // Required HASH type attribute
AttributeName: 'id',
KeyType: 'HASH',
},
{ // Required HASH type attribute
AttributeName: 'name',
KeyType: 'RANGE',
}
],
AttributeDefinitions: [ // The names and types of all primary and index key attributes only
{
AttributeName: 'id',
AttributeType: 'S', // (S | N | B) for string, number, binary
},
{
AttributeName: 'name',
AttributeType: 'S', // (S | N | B) for string, number, binary
},
{
AttributeName: 'city',
AttributeType: 'S', // (S | N | B) for string, number, binary
},
],
ProvisionedThroughput: { // required provisioned throughput for the table
ReadCapacityUnits: 400,
WriteCapacityUnits: 400,
},
GlobalSecondaryIndexes: [ // optional (list of GlobalSecondaryIndex)
{
IndexName: 'city_index',
KeySchema: [
{ // Required HASH type attribute
AttributeName: 'city',
KeyType: 'HASH',
}
],
Projection: { // attributes to project into the index
ProjectionType: 'ALL' // (ALL | KEYS_ONLY | INCLUDE)
},
ProvisionedThroughput: { // throughput to provision to the index
ReadCapacityUnits: 400,
WriteCapacityUnits: 400,
},
},
// ... more global secondary indexes ...
],
};
dynamodb.createTable(params, function(err, data) {
if (err){ console.log("error :" +JSON.stringify(err));} // an error occurred
else console.log("success :" +JSON.stringify(data)); // successful response
});
2) Insérez des données dans le tableau des villes
) Requête utilisant un index: -
var docClient = new AWS.DynamoDB.DocumentClient();
var table = "city";
var params = {
TableName : table,
IndexName : 'city_index',
KeyConditionExpression : 'city = :cityVal',
ExpressionAttributeValues : {
':cityVal' : 'london'
}
};
docClient.query(params, function(err, data) {
if (err) {
console.error("Unable to read item. Error JSON:", JSON.stringify(err,
null, 2));
} else {
console.log("GetItem succeeded:", JSON.stringify(data, null, 2));
}
});