Атрибут индекса AWS DynamoDB с несколькими типами - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть таблица, похожая на эту

account_id      email               deactivation_date           deleted_on
1               test1@test.com      2018-09-26T16:28:41.143Z    NULL
2               test2@test.com      2018-09-19T16:28:41.143Z    2018-09-19T16:28:41.143Z

Я использую AWS CLI для заполнения тестовых данных, как показано, поле удалено_on будет нулевым или будет иметь строку, если оно было деактивировано.

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

deactivation_date < tomorrow, and deleted_on is null

Это мой cft

  AttributeDefinitions:        
    - AttributeName: "account_id"
      AttributeType: "S"     
    - AttributeName: "email"
      AttributeType: "S"
    - AttributeName: "deactivation_date"
      AttributeType: "S"          
  KeySchema:
    -
      AttributeName: "account_id"
      KeyType: "HASH"
  GlobalSecondaryIndexes:     
    - IndexName: "email-index"
      KeySchema:
        - AttributeName: "email"
          KeyType: "HASH"
      Projection:
        ProjectionType: "ALL"
      ProvisionedThroughput:
        ReadCapacityUnits: !If [conditionIsProd, 10, 5]
        WriteCapacityUnits: !If [conditionIsProd, 10, 5]  
    - IndexName: "deactivation_date-index"
      KeySchema:
        - AttributeName: "deactivation_date"
          KeyType: "RANGE"
      Projection:
        ProjectionType: "ALL"
      ProvisionedThroughput:
        ReadCapacityUnits: !If [conditionIsProd, 10, 5]
        WriteCapacityUnits: !If [conditionIsProd, 10, 5]    

Он сохраняетжалуется на

Недопустимая KeySchema: первый KeySchemaElement не является типом ключа HASH (Сервис: AmazonDynamoDBv2; Код состояния: 400; Код ошибки: ValidationException; Идентификатор запроса: xxxxxxx)

и если я поставлюУдален как индекс, такой как

- AttributeName: "deleted_on"
  AttributeType: "S"    

Он будет жаловаться, потому что я пытался вставить NULL, но если я сделаю это

- AttributeName: "deleted_on"
  AttributeType: NULL   

Он также будет жаловаться, что я пытался добавить строку.

Я не уверен, как правильно это сделать

1 Ответ

0 голосов
/ 21 сентября 2018

Глобальный вторичный индекс всегда должен иметь хеш-ключ - вы определяете только ключ диапазона, поэтому вы получаете сообщение «first KeySchemaElement не является типом ключа HASH».

Во-вторых, вы не можете поместить нулевое или пустое значение в поля первичного ключа.

В любом случае вы не сможете выполнить нужный запрос, даже если вы правильно настроили ключи хеша и диапазона.Причина в том, что вы всегда должны указывать точный ключ хеша при выполнении запроса DynamoDB.Таким образом, «deactivation_date <завтра» не будет работать.</p>

Если вы можете предоставить больше информации о том, что вы пытаетесь сделать с помощью этого, возможно, сможете предоставить лучший дизайн таблицы

...