Запрос или сканирование DynamoDB для всех строк, которые имеют атрибут, соответствующий списку параметров - PullRequest
0 голосов
/ 17 января 2020

У меня есть таблица DynamoDB, которая имеет следующий формат

{
    id: "1234" (Primary Key, String)
    billNumber: "01" (Sort Key, String)
    month: 1 (Number)
    product: "Apple" (String)
    itemLocation": "Aisle 1" (String)
}

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

Я хочу знать, как запросить или отсканировать эту таблицу DDB, чтобы найти все itemLocations, которые id "1234" приобрел за месяц 1, где значение в поле Product соответствует списку заданных продуктов.

У меня также есть глобальный вторичный индекс по id-месяцу, который я могу использовать, чтобы найти все строки, купленные пользователем за месяц.

Значение, если таблица выглядела как

id   | billNumber | month |  product    |  itemLocation
1234 |     01     |   1   |   Apple     |  Aisle 1
1234 |     02     |   1   |   Banana    |  Aisle 2
1234 |     03     |   1   |   Cherry    |  Aisle 3
1234 |     04     |   1   |   Coke      |  Aisle 4

и я хотел получить itemLocations, которые id "1234" купил в месяц "1", где продукты были одного из {"Apple", "Banana", "Cherry"}. Меня возвращали бы каждую строку, кроме строки кока-колы, как показано ниже.

id   | billNumber | month |  product    |  itemLocation
1234 |     01     |   1   |   Apple     |  Aisle 1
1234 |     02     |   1   |   Banana    |  Aisle 2
1234 |     03     |   1   |   Cherry    |  Aisle 3

Возможно ли это в одном запросе или сканировании без необходимости запрашивать каждый продукт отдельно? Я полагаю, что мог бы решить проблему в моем примере, выполнив 3 запроса. Один и тот же идентификатор и месяц во всех 3 запросах и разные продукты в каждом запросе.

Самое близкое, что я получил, чтобы увидеть что-то, что могло бы работать, это Выражение условия DDB для этого, но это не кажется, не используется для запроса, а для операций CRUD.

1 Ответ

2 голосов
/ 17 января 2020

У вас не может быть таблицы DDB, которая выглядит так ...

При использовании DDB при использовании составного первичного ключа (ha sh + sort) комбинация должна быть уникальной.

Таким образом, вы не можете иметь

id   | month |  product   |  itemLocation
1234 |   1   |   Apple    |  Aisle 1
1234 |   1   |   Banana   |  Aisle 2
1234 |   1   |   Cherry   |  Aisle 3
1234 |   1   |   Coke     |  Aisle 4

, в котором 4 записи имеют одинаковый ключ ha sh (ID) и ключ сортировки (месяц)

EDIT
Хорошо, теперь у вас есть действительная таблица DDB ...

Но вы не можете запросить () ее для

с идентификатором "1234", купленным через месяц "1", где продукты были бы одним из {"Apple", "Banana", "Cherry"}

Scan () будет работать, но очень неэффективно ...

Чтобы сделать это эффективно, вам понадобится локальный вторичный индекс с ключом сортировки month#product

Теперь, в зависимости от того, сколько продуктов вам нужно будет запросить 3 раза

Query(table, hk='1234', sk='1#Apple')
Query(table, hk='1234', sk='1#Banana')
Query(table, hk='1234', sk='1#Cherry')

Или только один раз и отфильтруйте продукты на стороне сервера или на стороне клиента (обратите внимание, что фильтрация на стороне сервера не сохраняет единицы емкости чтения)

Query(table, hk='1234', sk BEGINS WITH '1#')
...