Отметка времени основного ключа DynamoDB
Я пытаюсь запросить набор данных в DynamodB, где первичный ключ является меткой времени. Сначала я хотел получить все данные для конкретного датчика. Я попытался с помощью сканирования (scan.json):
{
"sensorId": {
"AttributeValueList": [{
"S": "1234"
}],
"ComparisonOperator": "EQ"
}
}
Этот Json был использован через команду CLI:
aws dynamodb scan --table-name sensorData --scan-filter file://scan.json
Это было успешно и дало мне все данные для указанного датчика.
Теперь, если я хочу получить только метку времени и sensorId в качестве результата, я прочитал о выражении проекции и попытался выполнить запрос (query.json):
{
":Id":{"S":"1234"}
}
команда aws cli
aws dynamodb query --table-name sensorData --key-condition-expression "sensorId= :Id" --expression-attribute-values file://query2.json --projection-expression "timestamp"
Дал мне:
Произошла ошибка (ValidationException) при вызове операции Query: Invalid ProjectionExpression: имя атрибута является зарезервированным ключевым словом; зарезервированное ключевое слово: отметка времени
Но замена "timestamp" на "sensorId для целей тестирования дала мне:
Произошла ошибка (ValidationException) при вызове операции Query: условие запроса пропущено ключевой элемент схемы: timestamp
И я понимаю, что этот SensorId недопустим для выражения ключа. KeyConditionExpression принимает только ключевые атрибуты, ключ хеша и ключ диапазона. Но как получить результат?
Я хочу только метки времени для датчика. Мой Primarykey не прав? должно быть лучше использовать sensorId в качестве первичного ключа вместе с отметкой времени в качестве ключа диапазона?
1 ответ
Исходя из вашего сценария, лучше поменять ключи. Используйте SensorID в качестве ключа раздела и метку времени в качестве ключа сортировки.
Таким образом, вы можете запрашивать (без сканирования всех элементов) элементы для заданного SensorID. Также возможно отсортировать их в порядке отметки времени.
Если у вас есть больший набор данных (более нескольких килобайт), было бы эффективно создать LSI или GSI для проецирования необходимых атрибутов для данного запроса.
Примечание: TimeStamp является зарезервированным словом в DynamoDB. Вы можете использовать Имена атрибутов выражений, чтобы избежать ошибок при использовании зарезервированных атрибутов в выражениях запросов.