DynamoDB - выборка предметов несколькими ключами - PullRequest
0 голосов
/ 20 апреля 2020

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

Я пытаюсь получить несколько элементов из таблицы.

Моя схема таблицы определяется следующим образом :

{
  "AttributeDefinitions": [
    {
      "AttributeName": "id",
      "AttributeType": "S"
    },
    {
      "AttributeName": "date",
      "AttributeType": "S"
    }
  ],
  "KeySchema": [
    {
      "AttributeName": "id",
      "KeyType": "HASH"
    },
    {
      "AttributeName": "date",
      "KeyType": "RANGE"
    }
  ],
  ...
}

У меня есть список фильтров для идентификаторов и диапазон дат для каждого идентификатора:

[
    { "id": "abc", "start_date": "24/03/2020", "end_date": "26/03/2020" },
    { "id": "def", "start_date": "10/04/2020", "end_date": "20/04/2020" },
    { "id": "ghi", "start_date": "11/04/2020", "end_date": "11/04/2020" }
]

Мне нужно получить все элементы, которые соответствуют списку фильтров.

Проблема в том, что я не могу использовать Query, поскольку KeyConditionExpression принимает только один ключ раздела (и мне нужно сопоставить его со всем списком фильтров)

Условие должно выполнять равенство проверить значение ключа одного раздела.

Я не могу использовать BatchGetItem, так как для этого требуется точный ключ (и мне нужен диапазон дат для моего ключа сортировки Key('date').between(start_date, end_date))

Keys - Массив значений атрибутов первичного ключа, которые определяют указанные c элементы в таблице. Для каждого первичного ключа вы должны предоставить все ключевые атрибуты. Например, с простым первичным ключом вам нужно только указать значение ключа раздела. Для составного ключа необходимо указать как значение ключа разделения, так и значение ключа сортировки.

Я немного потерян ... Есть ли способ получить несколько ключей с помощью запроса диапазона ( одним запросом - не несколькими запросами от al oop)?

Вы бы предложили какие-либо изменения в таблице?

Ответы [ 2 ]

1 голос
/ 20 апреля 2020

Вам нужно сделать один запрос на уникальный id. Каждый из этих запросов должен включать выражение ключевого условия, которое имеет равенство для ключа раздела id и диапазон значений для ключа сортировки date, например:

#id = :id AND #date BETWEEN :startdate AND :enddate

Не использовать scan за это. По мере роста вашей таблицы производительность будет снижаться.

0 голосов
/ 20 апреля 2020

Вы можете использовать table.scan для получения нескольких записей. Смотри документацию здесь .

Вот пример кода:

import boto3

# Get the service resource.
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('tablename')

response = table.scan(
FilterExpression=Attr('first_name').begins_with('J') & Attr('account_type').eq('super_user')
)
items = response['Items']
print(items)
...