Запрос DynamoDB с использованием ИЛИ и начинается с

Прежде всего, я знаю, что мы не можем использовать оператор OR внутри KeyConditionExpression. Я храню свои ключи I18n в базе данных, и у меня есть следующая структура данных:

{
  "de": "Key in German",
  "en": "Key in English",
  "pk_id": "I18N-12345"
}

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

Я хотел получить запрос, выражение ключевого условия которого выглядит так:

{
  KeyConditionExpression: "begins_with(#de, :search_text) OR begins_with(#en, :search_text)"
}

Как было сказано ранее, это было бы идеально, но поскольку у нас нет операции OR, я действительно не знаю, как изменить запрос или как создать GSI, который позволил бы мне сделать этот запрос.

Спасибо


person Juan Rivillas    schedule 16.01.2020    source источник


Ответы (1)


Вы не объяснили, что такое ключи разделения и сортировки в своем примере. К сожалению, каждая таблица может иметь только один ключ сортировки - и только этот ключ сортировки можно эффективно фильтровать с помощью функции begins_with(), как это делали вы. И у вас не может быть и «en», и «de» в качестве ключей сортировки одной и той же таблицы.

Но есть кое-что, что вы можете сделать с LSI, чтобы обойти это ограничение. Вы можете указать «en» в качестве ключа сортировки исходной таблицы (я предполагаю, что pk_id - это ключ раздела?), А затем создать LSI (это даже не обязательно GSI - LSI более эффективны), ключ раздела которого то же самое (pk_id), но ключ сортировки - "de". Затем вы просто выполняете каждый запрос дважды - один раз в базовой таблице с begins_with(#en, :search_text) и один раз в LSI с помощью `begin_with (#de,: search_text). «ИЛИ», которое вы хотели, просто означает получение результатов обоих запросов.

person Nadav Har'El    schedule 16.01.2020
comment
Большое вам спасибо за ваше объяснение. Думаю, этой информации мне достаточно для решения проблемы. Поскольку мы избегаем создания LSI, я думаю, что создам два GSI и сделаю два отдельных запроса. Спасибо! - person Juan Rivillas; 16.01.2020
comment
Удачи. Я думаю, вам не нужны два GSI - только один GSI (с ключом сортировки de) плюс исходная таблица (с ключом сортировки en). Конечно, если в исходной таблице был другой ключ сортировки (о котором вы не упомянули), тогда, да, вы можете использовать два GSI, один на de, а другой на en. - person Nadav Har'El; 16.01.2020