Проблема с типом данных DynamoDB List

Согласно этому документу, DynamoDB поддерживает типы карты (M) и списка (L), но когда я пытаюсь создать таблицу с типом (L), я получаю сообщение об ошибке:

ValidationException (клиент): обнаружена 1 ошибка проверки: значение «L» в «attributeDefinitions.2.member.attributeType» не соответствует ограничению: элемент должен удовлетворять набору значений перечисления: [B, N, S]

Это происходит после добавления атрибута ThreadReplyIds к информации о таблице:

[
    'AttributeDefinitions' => [
        [
            'AttributeName' => 'UserId',
            'AttributeType' => 'N',
        ],
        [
            'AttributeName' => 'ThreadReplyIds', // <<---
            'AttributeType' => 'L',
        ],
        [
            'AttributeName' => 'Title',
            'AttributeType' => 'S',
        ],
    ],
    'KeySchema' => [
        [
            'AttributeName' => 'UserId',
            'KeyType' => 'HASH',
        ],
        [
            'AttributeName' => 'Title',
            'KeyType' => 'RANGE',
        ],
    ],
    'ProvisionedThroughput' => [
        'ReadCapacityUnits' => 5,
        'WriteCapacityUnits' => 5,
    ],
    'TableName' => 'Thread',
]

Моя цель - сохранить список или набор целочисленных значений для ThreadReplyIds. Что я делаю не так?


person Roman Newaza    schedule 15.02.2018    source источник


Ответы (1)


Сначала я подумал, что это может быть версия SDK, которую вы используете. Но после некоторого чтения документации кажется, что при создании таблицы AttributeType для любого AttributeDefinition может быть только одним из «S|N|B» (что означает «Строка», «Число» или «Двоичный»). Ссылка: Определение атрибута DynamoDB для PHP SDK.

Это имеет смысл, так как вы все равно не можете использовать список в своей KeySchema. Поэтому нет необходимости определять атрибут для вашего списка при создании таблицы. Вы всегда можете добавить этот атрибут к любым данным, которые вы хотите, при добавлении или обновлении элементов в вашей таблице после ее создания. См. здесь: PHP SDK DynamoDB PutItem

person Tim Klein    schedule 15.02.2018
comment
Это именно то, о чем я думал. В любом случае, это выглядит сбивающим с толку тем, что мы не можем определить такой атрибут заранее. - person Roman Newaza; 15.02.2018
comment
Что ж, это нереляционная система хранения, поэтому любой элемент может полностью отличаться от другого (за исключением ключей). SDK нужна только информация о том, какие атрибуты использовать для ключей при создании таблицы. - person Tim Klein; 15.02.2018
comment
И вы можете создать глобальный вторичный индекс или локальный вторичный индекс для любого элемента JSON верхнего уровня. - person Roman Newaza; 15.02.2018
comment
Я до сих пор не уверен, как добавить глобальный вторичный индекс в ключ списка типов? Это означает, что индексы могут быть созданы только для ключа, принадлежащего одному из типов [S,N,B]. Что, если мы хотим отсортировать список элементов внутри элемента? Например, магазины, принадлежащие пользователю? Какой тогда GSI мне придется поддерживать? - person ashutosh; 30.09.2018