Запрос Глобального вторичного индекса DynamoDB

#java #amazon-web-services #amazon-dynamodb #aws-sdk

Вопрос:

я пробую dynamodb локально и получил следующую таблицу:

 "Table": {
    "AttributeDefinitions": [
        {
            "AttributeName": "hashKey",
            "AttributeType": "S"
        },
        {
            "AttributeName": "sortKey",
            "AttributeType": "S"
        },
        {
            "AttributeName": "full_json",
            "AttributeType": "S"
        }
    ],
    "TableName": "local",
    "KeySchema": [
        {
            "AttributeName": "hashKey",
            "KeyType": "HASH"
        },
        {
            "AttributeName": "sortKey",
            "KeyType": "RANGE"
        }
    ],
    "TableStatus": "ACTIVE",
    "CreationDateTime": "2021-10-01T15:18:04.413000 02:00",
    "ProvisionedThroughput": {
        "LastIncreaseDateTime": "1970-01-01T01:00:00 01:00",
        "LastDecreaseDateTime": "1970-01-01T01:00:00 01:00",
        "NumberOfDecreasesToday": 0,
        "ReadCapacityUnits": 5,
        "WriteCapacityUnits": 1
    },
    "TableSizeBytes": 1066813,
    "ItemCount": 23,
    "TableArn": "arn:aws:dynamodb:ddblocal:000000000000:table/local",
    "GlobalSecondaryIndexes": [
        {
            "IndexName": "sortKeyIndex",
            "KeySchema": [
                {
                    "AttributeName": "sortKey",
                    "KeyType": "HASH"
                }
            ],
            "Projection": {
                "ProjectionType": "ALL"
            },
            "IndexStatus": "ACTIVE",
            "ProvisionedThroughput": {
                "ReadCapacityUnits": 10,
                "WriteCapacityUnits": 1
            },
            "IndexSizeBytes": 1066813,
            "ItemCount": 23,
            "IndexArn": "arn:aws:dynamodb:ddblocal:000000000000:table/local/index/sortKeyIndex"
        }
    ]
}
 

Я хочу запросить его с помощью Java, как это:

 Index index = table.getIndex("sortKeyIndex");
ItemCollection<QueryOutcome> items2 = null;
QuerySpec querySpec = new QuerySpec();
querySpec.withKeyConditionExpression("sortKey > :end_date")
                .withValueMap(new ValueMap().withString(":end_date","2021-06-30T07:49:22.000Z"));
items2 = index.query(querySpec);
 

Но он выдает исключение с «Условие ключа запроса не поддерживается». Я этого не понимаю, потому что в документах» Кто-нибудь может мне помочь

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

1. Обратите внимание, что если вы просто пробуете DDB, вам не следует использовать выделенную емкость; она будет взиматься с вас, даже если вы ее не используете.

2. Старый код V1. Чтобы работать с Amazon DynamoDB, вам следует изучить использование версии V2 и расширенного клиента. Видишь docs.aws.amazon.com/sdk-for-java/latest/developer-guide/…

Ответ №1:

Запрос DDB() требует ключевого условия, которое включает проверку на равенство ключа хэша/раздела.

Вы должны указать имя атрибута ключа раздела и одно значение для этого атрибута. Запрос возвращает все элементы с этим значением ключа раздела. При необходимости вы можете указать атрибут ключа сортировки и использовать оператор сравнения для уточнения результатов поиска.

Другими словами, единственный раз, когда вы действительно можете использовать Query (), — это когда у вас есть составной первичный ключ (хэш сортировка).

Без ключа сортировки, указанного как часть ключа для таблицы/GSI, функция Query() действует так же, как функция GetItem (), возвращающая одну запись с заданным хэш-ключом.

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

1. Спасибо вам за ваш ответ. Есть ли какой-то другой способ получить все элементы между определенным диапазоном времени без указания ключа раздела? например, получить все товары в период с 1 января 2020 года по 1 февраля 2020 года? Как бы мне нужно было структурировать свой DynamoDB

2. @realslimjp рассмотрим GSI с разделением временных меток между ключами хэша и сортировки. например, HK: ‘2020-01′ и SK: ’02-13:15:01.123456’

3. Атрибуты диапазона @realslimjp (ключ сортировки) автоматически упорядочиваются по алфавиту, а формат даты ISO8601 (ГГГГ — мм-ДДТЧ:ММ:СС.SSSZ00:00) «упорядочен» в том смысле, что сортируется по порядку. Если вы суффиксируете все атрибуты ключа сортировки в формате 8601 дата-время, вы можете использовать between функцию в ключе сортировки для поиска между двумя датами