Запрос DynamoDB с операторами сравнения

Вопрос Amazon AWS DynamoDB.

Есть ли примеры использования RangeKeyCondition и ComparisonOperators, таких как CONTAINS, IN, BETWEEN. Я пытаюсь получить данные на основе составного RangeKey (конкатенированные и ограниченные). Например, дата + автор + ключевые слова для таблицы книг. Предположим, что HashValue является "книгой" в этом случае (это могут быть книги, DVD, видео, ссылки и т.д.). Я хотел бы выбрать все книги, содержащие ключевое слово "magic" или все книги автора "John Doe". Пример записи/элемента будет выглядеть следующим образом:

Hash ------ Range --------------------------------------- -------------------------- атрибут1... attributex

book ------ 2012-1-20 ~ john doe ~ adventure ~ magic ~ travel ---------------- описание... некоторые вещи

При попытке использовать условный оператор IN или CONTAINS, я получаю следующую ошибку: Объект (CFSimpleXML) 20 public '__type' = > string 'com.amazon.coral.validate # ValidationException' (length = 45) public 'message' = > string 'Попытка условного ограничения не является индексируемой операцией'

Не удалось найти примеры с помощью этих ComparisonOperators. Любая помощь будет принята с благодарностью.

Спасибо.

Ответ 1

Важно понимать разницу между двумя API поиска Запрос и сканирование в Amazon DynamoDB:

  • Запрос

    Операция запроса выполняет поиск только значений атрибутов первичного ключа и поддерживает подмножество операторов сравнения по ключевым значениям атрибута для уточнить процесс поиска. Запрос возвращает все данные элемента для соответствующие первичные ключи (все атрибуты каждого элемента) до 1 МБ данных для каждой операции запроса. [...]

    [..] Информация о каждом операторе сравнения, доступном для запроса операции, см. запись API для запроса.

    [акцент мой]

  • Сканирование

    Операция сканирования сканирует всю таблицу. Вы можете указать фильтры для примените к результатам, чтобы уточнить возвращаемые вам значения, после полное сканирование. Amazon DynamoDB устанавливает ограничение 1 МБ на сканирование ( предел применяется до того, как результаты будут отфильтрованы). [...]

    [...] Информация о каждом операторе сравнения, доступном для сканирования операции, см. запись API для сканирования.

Теперь поддерживаемое подмножество для RangeKeyCondition: ComparisonOperator API запросов исключает CONTAINS и IN, которые оба доступны в API сканирования; в обоих API доступен только оператор сравнения BETWEEN.

Это ограничение, скорее всего, связано с соображениями производительности, т.е. поддержка CONTAINS, вероятно, победит цель DynamoDB предсказуемой производительности/пропускной способности.

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

Удачи!