Каждая таблица / индекс должна иметь 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-")