Элемент схемы пропущенных элементов запроса: Ошибка проверки

Я пытаюсь запросить dynamodb используя следующий код:

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

Когда я запускаю это, я получаю сообщение об ошибке:

ValidationException: Query condition missed key schema element: id

Я этого не понимаю. Я определил id как ключ раздела для таблицы jobs и вам нужно найти все задания, которые находятся в состоянии processing.

Ответ 1

Вы пытаетесь запустить запрос, используя условие, которое не включает первичный ключ. Вот как работают запросы в DynamoDB. Вам нужно будет сделать сканирование информации в вашем случае, однако я не думаю, что это лучший вариант.

Я думаю, вы хотите настроить глобальный вторичный индекс и использовать его для запроса статуса processing.

Ответ 2

В другом ответе @smcstewart ответил на этот вопрос. Но он предоставляет ссылку, а не комментирует, почему эта ошибка происходит. Я хочу добавить краткий комментарий, надеясь, что это сэкономит ваше время.

Документы AWS по запросам к таблице гласят, что вы можете выполнять запросы условий WHERE (например, SQL query SELECT * FROM Music WHERE Artist='No One You Know') способом DynamoDB, но с одним важным предупреждением:

Вы ДОЛЖНЫ указать условие РАВЕНСТВА для ключа PARTITION, и вы можете дополнительно указать другое условие для ключа SORT.

Это означает, что вы можете использовать только ключевые атрибуты с Query. Выполнение этого любым другим способом будет означать, что DynamoDB будет выполнять полное сканирование для вас, что НЕ эффективно, менее эффективно, чем использование глобальных вторичных индексов.

Так что, если вам нужно запрашивать неключевые атрибуты, обычно не рекомендуется использовать Query - лучший вариант - использовать глобальные вторичные индексы, как предложено @smcstewart.

Я нашел это руководство полезным для создания глобального вторичного индекса вручную.

Если вам нужно добавить его с помощью CloudFormation, здесь есть соответствующая страница.