web-dev-qa-db-fra.com

Élément de schéma de clé manquant dans la condition de requête: erreur de validation

J'essaie d'interroger dynamodb en utilisant le code suivant:

const AWS = require('aws-sdk');

let dynamo = new AWS.DynamoDB.DocumentClient({
  service: new AWS.DynamoDB(
    {
      apiVersion: "2012-08-10",
      region: "us-east-1"
    }),
  convertEmptyValues: true
});

dynamo.query({
  TableName: "Jobs",
  KeyConditionExpression: 'sstatus = :st',
  ExpressionAttributeValues: {
    ':st': 'processing'
  }
}, (err, resp) => {
  console.log(err, resp);
});

Lorsque je lance ceci, je reçois une erreur disant:

ValidationException: Query condition missed key schema element: id

Je ne comprends pas cela. J'ai défini id comme clé de partition pour la table jobs et je dois rechercher tous les travaux en statut processing.

19
Suhail Gupta

Vous essayez d'exécuter une requête à l'aide d'une condition n'incluant pas la clé primaire. Ceci est comment fonctionnent les requêtes dans DynamoDB . Vous auriez besoin de faire un recherchez les informations dans votre cas , cependant, je ne pense pas que ce soit la meilleure option.

Je pense que vous voulez configurer un index secondaire global et l'utiliser pour interroger le statut processing.

26
smcstewart

Dans une autre réponse @ smcstewart a répondu à cette question. Mais il fournit un lien au lieu de commenter pourquoi cette erreur se produit. Je veux ajouter un bref commentaire en espérant que cela vous fera gagner du temps.

AWS docs sur l'interrogation d'une table indique que vous pouvez effectuer WHERE des requêtes de condition (par exemple, SQL query SELECT * FROM Music WHERE Artist='No One You Know') à la manière de DynamoDB, mais avec une mise en garde importante:

Vous DEVEZ spécifier une condition EQUALITY pour la clé PARTITION et vous pouvez éventuellement fournir une autre condition pour la clé SORT.

Signification Vous ne pouvez utiliser que les attributs de clé avec Query. Le faire de toute autre manière signifierait que DynamoDB effectuerait pour vous une analyse complète qui est PAS efficace - moins efficace que l'utilisation d'index secondaires globaux.

Donc, si vous avez besoin d'interroger des attributs non-clés en utilisant Query n'est généralement PAS une option - la meilleure option consiste à utiliser Index secondaires globaux comme suggéré par @ smcstewart.

J'ai trouvé ce guide utile pour créer manuellement un index secondaire global.

Si vous avez besoin de l'ajouter à l'aide de CloudFormation voici une page pertinente .

3
Ula