Запрос вложенных атрибутов в Dynamodb - PullRequest
0 голосов
/ 24 мая 2018

Как эффективно запросить вложенные атрибуты в Dynamodb?

У меня есть структура документа, как показано ниже, которая позволяет мне сохранять связанную информацию в самом документе (а не ссылаться на него).

Имеет смысл хранить вложенные в курс семинары, так как они, вероятно, будут запрашиваться вместе с курсом (все они специфичны для курса, т. Е. Курс имеет много семинаров, а семинар принадлежит курсу).

В CouchDB, с которой я перехожу, я мог бы написать View, который бы проецировал некоторые вложенные атрибуты для запросов.Я понимаю, что не могу спроецировать что-либо, что не является атрибутом верхнего уровня, во вторичный индекс DynamodB, поэтому этот подход, похоже, не работает.

Это возвращает меня к вопросу: как можноЯ эффективно запрашиваю вложенные атрибуты без сканирования, если я не могу использовать их в качестве ключей в индексе?

Например, если я хочу получить среднюю посещаемость в театре Нельсона Манделы, как я могу запросить значенияregistrations и attendees на всех семинарах, где есть «Театр Нельсона Манделы», не прибегая к сканированию?

{
    “course_id”: “ABC-1234567”,
    “course_name”: “Statistics 101”,
    “tutors”: [“Cognito-sub-1”, “Cognito-sub-2”],
    “seminars”: [ 
        {
            “seminar_id”: “XXXYYY-12345”,
            “epoch_time”: “123456789”,
            “duration”: “5400”,
            “location”: “Nelson Mandela Theatre”,
            “name”: “How to lie with statistics”,
            “registrations”: “92”,                
            “attendees”: “61”
        },
        {
            “seminar_id”: “BBBCCC-44444”,
            “epoch_time”: “155555555”,
            “duration”: “5400”,
            “location”: “Nelson Mandela Theatre”,
            “name”: “Statistical significance for dog owners”,
            “registrations”: “244”,
            “attendees”: “240”
        },
        {
            “seminar_id”: “XXXAAA-54321”,
            “epoch_time”: “223456789”,
            “duration”: “4000”,
            “location”: “Starbucks”,
            “name”: “Is feral cat population growth a leading indicator for the S&P 500?”,
            “registrations”: “40”                
        }
    ]
}

{
    “course_id”: “CJX-5553389”,
    “course_name”: “Cat Health 101”,
    “tutors”: [“Cognito-sub-4”, “Cognito-sub-9”],
    “seminars”: [ 
        {
            “seminar_id”: “TTRHJK-43278”,
            “epoch_time”: “123456789”,
            “duration”: “5400”,
            “location”: “Catwoman Hall”,
            “name”: “Emotional support octopi for cats”,
            “registrations”: “88”, 
            “attendees”: “87”
        },
        {
            “seminar_id”: “BBBCCC-44444”,
            “epoch_time”: “123666789”,
            “duration”: “5400”,
            “location”: “Nelson Mandela Theatre”,
            “name”: “Statistical significance for cat owners”,
            “registrations”: “44”,
            “attendees”: “44”
        }
    ]
}

Ответы [ 3 ]

0 голосов
/ 16 октября 2018

Вы можете сделать одну вещь, чтобы заставить его работать в Scan. Хранить объект в формате stringify, например {"language": "[{\" language \ ": \" Male \ ", \" proficibility \ ": \" Female\ "}]"} `` и затем может выполнить операцию сканирования языка: {содержит: "Мужской"}

на стороне клиента вы можете выполнить JSON.parse (язык)

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

У меня еще нет такого опыта работы с DynamoDB, но я начал его изучать, поскольку планирую использовать его для своего следующего проекта.

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

Рассматривая Рекомендации , в частности Рекомендации по использованию вторичных индексов в DynamoDB , можно понять, чтоПравильный подход должен использовать разные типы линий под тем же ключом разделения, как показано здесь .Тогда при том же course_id у вас будет общий ключ сортировки (sk).Тогда первый регистр будет иметь sk = 'Details' с данными курса, затем другие регистры, такие как "семинар-1" и его данные, и так далее.Затем вы должны задать свойства семинара, которые вы хотите запросить, как SGI (вторичный глобальный индекс), имея в виду, что он может иметь только 5 SGI на таблицу.

Надеюсь, это поможет.

0 голосов
/ 26 мая 2018

Индекс не может быть создан для вложенных атрибутов (т. Е. Типов данных документа в Dynamodb).

Типы документов - Тип документа может представлять собой сложную структуру с вложенными атрибутами, например, как вДокумент JSON.Типы документов: список и карта.

Query Api: -

Операция запроса ищет только значения атрибутов первичного ключа и поддерживает подмножество операторов сравнения назначения ключевых атрибутов для уточнения процесса поиска.

API сканирования: -

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

Чтобы использовать Query API, требуется значение ключа хеш-функции.У OP нет информации о том, что доступно значение хеш-ключа.Согласно OP, данные должны запрашиваться атрибутом location, который находится внутри типа данных Dynamodb List.Теперь можно посмотреть на GSI.

Пожалуйста, прочитайте больше о GSI .Одним из правил является то, что GSI может быть создан только с использованием атрибутов верхнего уровня.Таким образом, местоположение нельзя использовать для создания индекса.

Итак, создание GSI для использования API запросов также исключено.

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

Из-за вышеупомянутых причин API-интерфейс Query нельзя использовать для получения данных на основе атрибута location в предположении хэшазначение ключа недоступно.

Если доступно значение хэш-ключа, FilterExpression может использоваться для фильтрации данных.Единственный способ фильтрации данных, представленных в типе данных сложного списка, - это функция CONTAINS.Чтобы использовать функцию CONTAINS, все атрибуты в вхождении должны соответствовать данным (т. Е. Семинар_ид, местоположение, продолжительность и все другие атрибуты).Таким образом, определенно невозможно выполнить сценарий использования, упомянутый в OP, с использованием текущей модели данных.

Предлагаемое альтернативное решение: -

Повторное моделирование данныхструктура, как упомянуто ниже, могла бы решить проблему.Определенно нет другого решения для использования варианта использования API запросов.

Основная таблица: -

Идентификатор курса - Хэш-ключ

semin_id- Ключ сортировки

GSI: -

Место проведения семинара - Ключ хеша

Идентификатор курса - Ключ сортировки

Втаблица DynamoDB, каждое значение ключа должно быть уникальным.Однако значения ключа в глобальном вторичном индексе не обязательно должны быть уникальными.

Теперь вы можете использовать API запросов в GSI для получения данных для Seminar locationравно Nelson Mandela Theatre.Вы можете использовать идентификатор курса в запросе API, если вы знаете значение.API запроса потенциально даст несколько элементов в наборе результатов.Вы можете использовать FilterExpression, если хотите дополнительно фильтровать данные на основе неключевых атрибутов.

...