DynamoDB найти все элементы после даты - PullRequest
0 голосов
/ 19 февраля 2020

У меня есть таблица 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 извлечь все элементы после даты?

Ответы [ 2 ]

0 голосов
/ 19 февраля 2020

Так что это было полезно -

{ ссылка }

, а также это -

Как запросить DynamoDB по дате (диапазон ключ), без очевидного га sh ключ?

В конце ответ должен был денормализовать данные, заменив поле date (и связанный вторичный индекс) на поле week затем поиск одной или нескольких указанных c недель с использованием условия запроса eq и объединение результатов (мне нужны только данные за пару недель)

Очевидно, можно заменить week на month для увеличения диапазон, но уменьшенная зернистость.

0 голосов
/ 19 февраля 2020

Вы не можете использовать GTE. Запросы поддержки EQ | LE | LT | GE | GT | BEGINS_WITH | МЕЖДУ

Проверьте эту статью https://medium.com/cloud-native-the-gathering/querying-dynamodb-by-date-range-899b751a6ef2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...