#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
функцию в ключе сортировки для поиска между двумя датами