У меня есть таблица DynamoDB, в которой я храню данные ссылок (url
, date
, category
, tags
et c).
Мне нужно иметь возможность -
- поиск элементов по
url
(проверка url
еще не существует) - поиск всех элементов, сохраненных после данного
date
Исходя из вышеизложенного, я настроил схему с url
в качестве первичного ключа ha sh и вторичного индекса на date
, следующим образом -
AWSTemplateFormatVersion: '2010-09-09'
Parameters:
TableName:
Type: String
Default: "my_links"
HashAttr:
Type: String
Default: url
IndexAttr:
Type: String
Default: date
ReadCapacity:
Type: Number
Default: 5
WriteCapacity:
Type: Number
Default: 5
Resources:
Table:
Properties:
KeySchema:
- AttributeName: !Ref HashAttr
KeyType: HASH
AttributeDefinitions:
- AttributeName: !Ref HashAttr
AttributeType: S
- AttributeName: !Ref IndexAttr
AttributeType: S
GlobalSecondaryIndexes:
- IndexName: !Ref IndexAttr
KeySchema:
- AttributeName: !Ref IndexAttr
KeyType: HASH
Projection:
ProjectionType: ALL
ProvisionedThroughput:
ReadCapacityUnits: !Ref ReadCapacity
WriteCapacityUnits: !Ref WriteCapacity
ProvisionedThroughput:
ReadCapacityUnits: !Ref ReadCapacity
WriteCapacityUnits: !Ref WriteCapacity
TableName: !Ref TableName
Type: AWS::DynamoDB::Table
Я могу запросить таблицу с помощью date
как следует, но только с использованием условия eq
-
ddb=boto3.resource("dynamodb")
table=ddb.Table("my_links")
from boto3.dynamodb.conditions import Key
queryexp=Key('date').eq("2020-02-19")
for item in table.query(IndexName="date",
KeyConditionExpression=queryexp)["Items"]:
print (item)
Если я использую gte
вместо условия eq
, я получаю следующее -
botocore.exceptions.ClientError: An error occurred (ValidationException) when calling the Query operation: Query key condition not supported
Я могу однако запросите таблицу, используя сканирование и условие gte
-
filterexp=Key('date').gte("2020-02-19")
for item in table.scan(FilterExpression=filterexp)["Items"]:
print (item)
Но тогда я предполагаю, что мне больше не нужен вторичный индекс, а также что это будет очень дорого, так как таблица получить большое значение: - /
Так что я бы предпочел придерживаться вторичного индекса и запроса, если это возможно (я думаю об этом правильно?), но что мне нужно сделать со схемой, чтобы иметь возможность o извлечь все элементы после даты?