Как запросить массив значений первичного ключа в DynamodB - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть одна таблица в AWS Dynamodb с 1 миллионом записей. Можно ли запросить массив значений первичного ключа в одном запросе с дополнительным условием ключа сортировки в Dynamodb? Я использую для своей серверной логики.

Вот параметры

var params = {
TableName: "client_logs",
KeyConditionExpression: "#accToken = :value AND ts between :val1 and 
:val2", 
ExpressionAttributeNames: {
"#accToken": "acc_token"
},
ExpressionAttributeValues: {
        ":value": clientAccessToken,
        ":val1": parseInt(fromDate),
        ":val2": parseInt(toDate),
        ":status":confirmStatus
},
FilterExpression:"apiAction = :status"


};

Здесь acc_token - это первичный ключ, и я хочу запросить массив значений access_token в одном запросе.

1 Ответ

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

Нет, это невозможно.Один запрос может искать только одно конкретное значение хеш-ключа.(См. DynamoDB - Запрос .)

Однако вы можете выполнять несколько запросов параллельно, что даст желаемый эффект.

Редактировать (2018-11-21)

Поскольку вы сказали, что вам нужно более 200 хеш-ключей, вот два возможных решения.Эти решения не требуют неограниченных параллельных вызовов DynamoDB, но они будут стоить вам больше RCU.Они могут быть быстрее или медленнее, в зависимости от распределения данных в вашей таблице.

Я не знаю, как распределяются ваши данные, поэтому я не могу сказать, какой из них лучше для вас.Во всех случаях мы не можем использовать acc_token в качестве ключа сортировки GSI, потому что вы не можете использовать оператор IN в выражении KeyConditionExpression.(См. DynamoDB - Условие .)

Решение 1

Эта стратегия основана на Глобальный вторичный индексный индексный запрос для запросов выборочных таблиц

Шаги:

  1. Добавьте новый атрибут к элементам, которые вы записываете в свою таблицу.Этот новый атрибут может быть числом или строкой.Давайте назовем это index_partition.
  2. Когда вы записываете новый элемент в вашу таблицу, присвойте ему случайное значение от 0 до N для index_partition.(Здесь N - произвольная константа по вашему выбору. 9, вероятно, является приемлемым значением для начала.)
  3. Создайте GSI с хеш-ключом index_partition и ключом сортировки ts.Вам нужно будет проецировать apiAction и acc_token в GSI.
  4. Теперь вам нужно только выполнить N запросов.Используйте ключевое выражение условия index_partition = :n AND ts between :val1 and :val2 и выражение фильтра apiAction = :status AND acc_token in :acc_token_list

Решение 2

Это решение аналогично последнему, но вместо этогоПри использовании случайного шардинга GSI, мы будем использовать раздел GSI на основе даты.

Шаги:

  1. Добавить новый строковый атрибут для элементов, которые вы записываете в свою таблицу.Давайте назовем это ts_ymd.
  2. Когда вы пишете новый элемент в вашу таблицу, используйте только часть yyyy-mm-dd из ts, чтобы установить значение ts_ymd.(Вы можете использовать любую гранулярность, которая вам нравится. Это зависит от вашего типичного диапазона запросов для ts. Если :val1 и :val2 обычно находятся на расстоянии всего одного часа друг от друга, тогда подходящий ключ раздела GSI может быть гггг-мм-dd-hh.)
  3. Создать GSI с хеш-ключом ts_ymd и ключом сортировки ts.Вам нужно будет проецировать apiAction и acc_token в GSI.
  4. Предполагая, что вы использовали yyyy-mm-dd для ключа раздела GSI, вам нужно будет выполнять только один запрос на каждый день, который находится в пределах:val1 и :val2.Используйте выражение условия ключа ts_ymd = :ymd AND ts between :val1 and :val2 и выражение фильтра apiAction = :status AND acc_token in :acc_token_list

Решение 3

Я не знаю, сколько разных значенийapiAction есть и как эти значения распределяются, но если их несколько, и они имеют примерно одинаковое распределение, вы можете разделить GSI на основе этого значения.Чем больше возможных значений для apiAction, тем лучше для вас это решение.Ограничивающим фактором здесь является то, что вам нужно иметь достаточно значений, чтобы вы не столкнулись с пределом раздела 10 ГБ для GSI.

Шаги:

  1. Создание GSI с хеш-ключомapiAction и ключ сортировки ts.Вам нужно будет проецировать acc_token в GSI.
  2. Вам нужно выполнить только один запрос.Используйте ключевое условие выражения apiAction = :status AND ts between :val1 and :val2" and a filter expression of acc_token in: acc_token_list`.

Для всех этих решений вы должны учитывать, насколько равномерно будет распределен ключ раздела GSI, и размер типичного диапазона для ts в вашем запросе.Вы должны использовать выражение фильтра на acc_token, поэтому вы должны попытаться выбрать решение, которое минимизирует общее количество элементов, которое будет соответствовать вашему выражению условия ключа, но в то же время вам нужно знать, что вы не можетеиметь более 10 ГБ данных для одного ключа раздела (для таблицы или для GSI).Вам также нужно помнить, что GSI можно запрашивать только как окончательно согласованное чтение.

...