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

#amazon-web-services #amazon-dynamodb #boto3

Вопрос:

Я хочу извлечь все элементы с помощью запроса() из таблицы не с помощью сканирования, так как это очень дорого
, Могу ли я использовать .содержит() без table.scan()

 dynamodb = boto3.resource('dynamodb')
table= dynamodb.Table('investors')
data = table.scan(
        FilterExpression=Attr('groups_name').contains('person_name')
)

# Something like this
data = table.query(...
    ....    
    ('groups_name').contains('person_name')
)
 

В моем DynamoDB -> инвесторы (таблица)>(у всех один и тот же ключ раздела=»фонд»)
-> пример элемента ->> имя группы [список]: имя человека (строка)

Ответ №1:

Если вы хотите извлечь все элементы из таблицы и иметь более одного значения ключа раздела, вам придется использовать Scan . Query API работает с одной коллекцией элементов (т. Е. со всеми элементами с одним и тем же ключом раздела), и фильтрация с помощью FilterExpression этого также может быть выполнена там.

Фильтр содержит также недоступен для a KeyConditionExpression или FilterExpression в операции запроса, самое близкое совпадение было бы starts_with , но это другое.

Чтобы эффективно обрабатывать этот шаблон доступа, вам необходимо пересмотреть свою модель данных.

Комментарии:

1. Да, у меня есть все элементы с одним и тем же ключом раздела (предположим, что имя ключа раздела= «фонд»). Как выполнить запрос с помощью выражения фильтра?

2. Как я пытался выразить: contains недоступно в a FilterExpression of Query . Вам нужно использовать Scan для этого. Кроме того, выражения фильтра оцениваются после прочтения, это не сэкономит вам и деньгам, за исключением bandwitdh