DynamoDB не может получить элемент по ключу диапазона? - PullRequest
0 голосов
/ 29 ноября 2018

Я пытаюсь получить одну запись из таблицы DynamoDB, используя столбец, определенный как ключ RANGE, но когда я это получаю, я получаю эту ошибку:

The provided key element does not match the schema

Вот как яm создание и заполнение таблицы:

// Create words table
if(!tableExists('words')) {
  console.log('Creating words table');
  await createTable({
    TableName: 'words',
    KeySchema: [
      { AttributeName: 'id', KeyType: 'HASH' },
      { AttributeName: 'index', KeyType: 'RANGE' },
    ],
    AttributeDefinitions: [
      { AttributeName: 'id', AttributeType: 'S' },
      { AttributeName: 'index', AttributeType: 'N' },
    ],
    ProvisionedThroughput: { ReadCapacityUnits: 5, WriteCapacityUnits: 5 },
  });
  await wait(5000);
  console.log('done');
} else {
  console.log('words table found. Skipping.')
}

// Seed words
let index = 0;
for(let word of words) {
  console.log(`Adding word ${word}`);
  const params = {
    TableName: tableName('words'),
    Item: {
      id: word,
      index: index,
    },
  };
  await db.put(params).promise();
  console.log('added');
  index++;
}

И вот как я пытаюсь извлечь запись:

const db = require('../db');
const getResponseItem = response => response.Item;

module.exports = function loadWordByIndex(index) {
  return db.get({
    TableName: 'talk_stem.words',
    Key: {
      index,
    },
  })
  .promise()
  .then(getResponseItem);
};

Какой смысл определять ключ RANGE, если я могудаже не ссылаться на это в запросах?

1 Ответ

0 голосов
/ 30 ноября 2018

Когда вы делаете get, вы можете только попросить предмет.Get возвращает (или нет) один единственный элемент, который соответствует полному ключу, в противном случае "Предоставленный ключевой элемент не соответствует схеме" .Пример:

const id = 'marmelade';
const index = 5;

db.get({
  TableName: 'talk_stem.words',
  Key: {
    id,
    index,
  },
}).promise()

С get вы ищете один элемент!

Вам нужен query ( см. Документ здесь ) .Вы можете представить себе что-то вроде этого:

db.query({
  TableName: 'talk_stem.words',
  KeyConditionExpression: '#id = :id AND #index BETWEEN :indexLow AND :indexHigh',
  ExpressionAttributeNames: {
    '#id': 'id',
    '#index': 'index',
  },
  ExpressionAttributeValues: {
    ':id': id, # a fixed id
    ':indexLow': 3,
    ':indexHigh': 9,
  },
}).promise()

Имейте в виду, что с DynamoDB get и query необходимо упомянуть ключ раздела.Всегда.Когда вы хотите получить элементы для ключей разделов, которые вы не знаете, вы можете сделать только «дорогой» scan.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...