Отметка времени основного ключа 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. Вы можете использовать Имена атрибутов выражений, чтобы избежать ошибок при использовании зарезервированных атрибутов в выражениях запросов.

Другие вопросы по тегам