Как использовать фильтр в BatchGetItem - PullRequest
0 голосов
/ 07 мая 2019

Я получаю несколько элементов из DynamodB, используя BatchGetItem. Но мне нужно отфильтровать предметы по некоторым условиям.

Например: у меня есть таблица задач с идентификатором и статусом. Мне нужно выбрать элементы с идентификаторами 1, 2, 3, где статус = готово.

#set($ids = [1,2,3])
{    
    "operation" : "BatchGetItem",
    "tables" : {
        "userTable": {
            "keys": $util.toJson($ids)
        }
    }
}

1 Ответ

0 голосов
/ 08 мая 2019

Выражения фильтра не поддерживаются в BatchGetItem. Думайте о BatchGetItem как о пакетной версии операции GetItem. GetItem поддерживает получение только элемента на основе его первичного ключа.

В вашем примере, если столбец status не является частью первичного ключа, то BatchGetItem или GetItem не будут работать для вас.

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

Используйте BatchGetItem с фильтрацией элементов в коде

Если количество элементов ввода относительно мало, вы можете просто использовать BatchGetItem, а затем отфильтровать в коде (здесь в VTL) те, где status!=done.

Плюсы : Вам не нужно менять схему таблицы или добавлять индексы

Минусы : Вы будете платить за все Единицы считывания емкости, необходимые для извлечения элементов перед фильтрацией. Также будет задержка, так как ваш API будет загружать потенциально ненужные элементы.

Использование Scan С выражением IN

Если таблица небольшая, вы можете отсканировать всю таблицу и предоставить выражение фильтра IN.

Плюсы : Вам не нужно менять схему таблицы или добавлять индексы

Минусы : Вам придется сканировать всю таблицу, это будет медленно и дорого для больших таблиц.

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

...