Получение ошибки "слишком большая схема ключей" с LocalSecondaryIndexes с DynamoDB? - PullRequest
0 голосов
/ 13 февраля 2019

Я пытаюсь создать таблицу DynamoDB, используя скрипт Node.js, показанный ниже.Если я удаляю блок LocalSecondaryIndexes и удаляю определения двух атрибутов, которые больше не нужны после этого удаления, код работает нормально и успешно создает таблицу.Но с этим блоком, как показано в коде ниже, я получаю следующую ошибку от DynamoDB:

Unable to create table. Error JSON: {
  "message": "Key Schema too big.  Key Schema must at most consist of the hash and range key of a table",
  "code": "ValidationException",
  "time": "2019-02-13T19:45:34.482Z",
  "statusCode": 400,
  "retryable": false,
  "retryDelay": 29.475438988642534
}

Как я могу исправить эту проблему?

Воткод:

// Create the quizzes table in DynamoDB.
var AWS = require('aws-sdk');

AWS.config.update({
  region: process.env.AWS_REGION,
  endpoint: process.env.AWS_ENDPOINT
});

var dynamodb = new AWS.DynamoDB();

var params = {
    TableName : "Quizzes",
    KeySchema: [
        { AttributeName: "author_id", KeyType: "HASH"},  //Partition key
        { AttributeName: "quiz_id", KeyType: "RANGE" }  //Sort key
    ],
    // Secondary key allows us to get all the different versions of a
    //  a particular quiz, referenced by quiz name, for all the available
    //  languages the quiz supports.
    LocalSecondaryIndexes: [
        {
            IndexName: "ForeignLanguageSupportIndex",
            KeySchema: [
                { AttributeName: "author_id", KeyType: "HASH"},  //Partition key
                { AttributeName: "quiz_name", KeyType: "RANGE" },  //Sort key
                { AttributeName: "language_code", KeyType: "RANGE" },  //Sort key
                { AttributeName: "quiz_id", KeyType: "RANGE" }  //Sort key
            ],
            Projection: {
                ProjectionType: "ALL"
            }
        }
    ],
    AttributeDefinitions: [
        { AttributeName: "author_id", AttributeType: "S" },
        { AttributeName: "quiz_name", AttributeType: "S" },
        { AttributeName: "language_code", AttributeType: "S" },
        { AttributeName: "quiz_id", AttributeType: "S" }
    ],
    // Using on-demand provisioning (pay as you go, no pre-allocation).
    BillingMode: "PAY_PER_REQUEST"
};

dynamodb.createTable(params, function(err, data) {
    if (err) {
        console.error("Unable to create table. Error JSON:", JSON.stringify(err, null, 2));
    } else {
        console.log("Created table. Table description JSON:", JSON.stringify(data, null, 2));
    }
});

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Каждая таблица / индекс должна иметь 1 хэш-ключ и 0 или 1 диапазонный ключ.Если вам нужно выполнить запрос с использованием нескольких атрибутов, вы можете создать несколько индексов или, если данные являются иерархическими, как у вас, вы можете объединить несколько фрагментов данных в ключ сортировки.(Официальный пример см. в блоге AWS . См. Также Рекомендации по использованию ключей сортировки для организации данных .)

Как создать таблицу?

Вы можете создать нужный вам индекс следующим образом:

// Create the quizzes table in DynamoDB.
var AWS = require('aws-sdk');

AWS.config.update({
  region: process.env.AWS_REGION,
  endpoint: process.env.AWS_ENDPOINT
});

var dynamodb = new AWS.DynamoDB();

var params = {
    TableName : "Quizzes",
    KeySchema: [
        { AttributeName: "author_id", KeyType: "HASH"},  //Partition key
        { AttributeName: "quiz_id", KeyType: "RANGE" }  //Sort key
    ],
    // Secondary key allows us to get all the different versions of a
    //  a particular quiz, referenced by quiz name, for all the available
    //  languages the quiz supports.
    LocalSecondaryIndexes: [
        {
            IndexName: "ForeignLanguageSupportIndex",
            KeySchema: [
                { AttributeName: "author_id", KeyType: "HASH"},  //Partition key
                { AttributeName: "quiz_name_language", KeyType: "RANGE" },  //Sort key

            ],
            Projection: {
                ProjectionType: "ALL"
            }
        }
    ],
    AttributeDefinitions: [
        { AttributeName: "author_id", AttributeType: "S" },
        { AttributeName: "quiz_name_language", AttributeType: "S" },
        { AttributeName: "quiz_id", AttributeType: "S" }
    ],
    // Using on-demand provisioning (pay as you go, no pre-allocation).
    BillingMode: "PAY_PER_REQUEST"
};

dynamodb.createTable(params, function(err, data) {
    if (err) {
        console.error("Unable to create table. Error JSON:", JSON.stringify(err, null, 2));
    } else {
        console.log("Created table. Table description JSON:", JSON.stringify(data, null, 2));
    }
});

Так как же выглядят мои данные?

Ваш объект, который вы читаете / пишете, будет выглядеть примерно такthis:

{
    author_id: "author1234",
    quiz_name: "DynamoDBExperienceSurvey",
    language_code: "en-us",
    quiz_name_language: "DynamoDBExperienceSurvey/en-us",
    quiz_id: "55dc0736-2fdf-11e9-b210-d663bd873d93",
    quiz_data: {
        ...
    }
}

Как мне выполнить мои запросы?

Вот ключевые выражения условия для получения необходимых данных.

ДляЧтобы получить все опросы от определенного автора, вы можете запросить таблицу или LSI, используя только хеш-ключ.

author_id = "theAuthorId" 

Чтобы получить все языковые варианты теста, основанные на имени, ваше условие ключа будет

author_id = "theAuthorId" AND begins_with(quiz_name_language, "theQuizName/")

В этом случае важно, чтобы вы добавили / (или любой другой разделитель, который вы используете) в конце названия теста, иначе «theQuizName» также вернет результаты для «theQuizName2», "theQuizName3" и т. д.

Бонус: вы также можете запросить всерегионализированные варианты конкретного языка с использованием первой части языкового кода.

author_id = "theAuthorId" AND begins_with(quiz_name_language, "theQuizName/en-")
0 голосов
/ 13 февраля 2019

Вы можете иметь только 1 ключ хеш-функции и 1 ключ сортировки ... для таблицы, локальных вторичных индексов (LSI) или глобальных вторичных индексов (GSI).

Вам необходимо объединить quiz_name, language_code,и quiz_id в одну строку или создайте несколько LSI.

Выбор зависит от того, как вам нужно запрашивать LSI.

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