Dynamodb: Почему первичный ключ не может быть частью выражения фильтра?

Допустим, у нас есть таблица с items, у которой есть атрибут userId (ключ раздела, строка) и атрибут creationTime (ключ сортировки, число). Я хотел бы выполнить запрос, который извлекает элементы пользователя от времени t1 до времени t2 по вторичному индексу.

Поскольку я не могу иметь несколько условий диапазона для одного и того же элемента, моя идея состояла в том, чтобы добавить выражение фильтрации, чтобы ограничить результаты:

aws dynamodb query --table-name items --index-name userId-creationTime-index --key-condition-expression "userId=:u AND creationTime<=:t1" --filter-expression "creationTime>=:t2" --expression-attribute-values '{":u":{"S":"6f3b581d-8632-4edc-a19d-b77f158d8a23"}, ":t1":{"N":"1456647476000000"}, ":t2":{"N":"1456561076000000"}}'

Запрос не работает с

A client error (ValidationException) occurred when calling the Query operation: Filter Expression can only contain non-primary key attributes: Primary key attribute: creationTime

Это очень странно. Разве фильтрация не ограничивает результат после выполнения запроса? Разве нельзя реализовать такое условие, как t1 <= creationDate <= t2?


person user331244    schedule 29.02.2016    source источник
comment
Нашел обходной путь с помощью оператора BETWEEN. Однако, если бы кто-нибудь мог объяснить, почему я не могу использовать тот же атрибут в выражении фильтрации, было бы здорово!   -  person user331244    schedule 29.02.2016
comment
Представитель Amazon говорит, что это в интересах пользователей. Это все еще не так. Не совсем понятно, почему пользователь не может использовать все условные операторы (доступные в выражениях фильтра) в выражениях ключевых условий.   -  person rob    schedule 09.03.2016
comment
Когда вы говорите о вторичных индексах, вы имеете в виду локальные вторичные индексы? Потому что это кажется возможным в этом примере. docs.amazonaws.cn/en_us/amazondynamodb/latest/ руководство разработчика/   -  person strongjz    schedule 29.12.2016
comment
Это было для GSI   -  person user331244    schedule 03.01.2017


Ответы (1)


DynamoDB сначала будет последовательно считывать страницу ваших элементов с хоста, на котором хранятся ваши данные. Ключевое условие, указанное выше, используется для ограничения данных, считываемых с хоста, на котором хранятся ваши элементы. Затем он будет фильтровать результаты, считанные с хоста хранилища, на основе предоставленных вами параметров фильтра. RCU возникают из-за фактического объема чтения на хостах хранилища. Используя KeyConditions для атрибутов первичного ключа и выражения фильтра для всего остального, вы можете лучше контролировать стоимость чтения операций запроса. Наличие более жестких условий для KeyCondition операции запроса ограничит количество прочитанных элементов, уменьшив RCU, потребляемый в каждой операции запроса.

person Alexander Patrikalakis    schedule 12.02.2017