Amazon dynamodb DynamoDB主键时间戳

Amazon dynamodb DynamoDB主键时间戳,amazon-dynamodb,aws-cli,primary-key-design,Amazon Dynamodb,Aws Cli,Primary Key Design,iam试图在dynamodb中查询主键为时间戳的数据集。 首先,我想获取特定传感器ID的所有数据。 我尝试了扫描(scan.json): 此Json是通过CLI命令使用的: aws dynamodb scan --table-name sensorData --scan-filter file://scan.json 这是成功的,并为我提供了指定sensorid的所有数据 现在,如果我只想得到timestamp和sensorId作为结果,我阅读了有关投影表达式的内容,并尝试执行一个查询(qu

iam试图在dynamodb中查询主键为时间戳的数据集。 首先,我想获取特定传感器ID的所有数据。 我尝试了扫描(scan.json):

此Json是通过CLI命令使用的:

aws dynamodb scan --table-name sensorData --scan-filter file://scan.json 
这是成功的,并为我提供了指定sensorid的所有数据

现在,如果我只想得到timestamp和sensorId作为结果,我阅读了有关投影表达式的内容,并尝试执行一个查询(query.json):

aws cli命令

aws dynamodb query --table-name sensorData --key-condition-expression "sensorId= :Id" --expression-attribute-values file://query2.json --projection-expression "timestamp"
给我:

调用查询时发生错误(ValidationException) 操作:无效的ProjectionExpression:属性名称是保留名称 关键词;保留关键字:时间戳

但将“时间戳”替换为“用于测试的sensorId”给了我:

调用查询时发生错误(ValidationException) 操作:查询条件缺少关键架构元素:时间戳

我知道sensorId对密钥表达式无效。。 KeyConditionExpression只接受键属性、哈希键和范围键。 但如何获得结果呢

我只想要sensorId的时间戳。
我的Primarykey是否错误?最好使用sensorId作为主键,同时使用时间戳作为范围键?

根据您的情况,最好更改密钥。使用sensorId作为分区键,使用时间戳作为排序键

通过这种方式,您可以查询(无需扫描所有项目)给定SensorID的项目。还可以按照时间戳的顺序对它们进行排序

如果您有一个更大的数据集(多于几个Killobytes),那么创建一个LSI或GSI来投影给定查询所需的属性将是非常有效的

注意:时间戳在DynamoDB中是一个标记。在查询表达式中使用保留属性时,可以使用来避免错误

{
    ":Id":{"S":"1234"}
}
aws dynamodb query --table-name sensorData --key-condition-expression "sensorId= :Id" --expression-attribute-values file://query2.json --projection-expression "timestamp"