web-dev-qa-db-fra.com

Interrogation de DynamoDB sans clé primaire

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:

  • id -> Clé de partition primaire
  • clé de tri primaire -> nom

GSI:

  • Clé de partition/clé primaire -> ville
  • Projeté -> Tout

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));
14
joeCarpenter

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));
    }
});
17
notionquest