DynamoDB主键时间戳

Kha*_*han 2 primary-key-design amazon-dynamodb aws-cli

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

{
"sensorId": {
    "AttributeValueList": [{
        "S": "1234"
    }],
    "ComparisonOperator": "EQ"
}
  }
Run Code Online (Sandbox Code Playgroud)

此Json通过CLI命令使用:

aws dynamodb scan --table-name sensorData --scan-filter file://scan.json 
Run Code Online (Sandbox Code Playgroud)

那成功了,并为我提供了指定sensorid的所有数据。

现在,如果我只希望将时间戳记和sensorId作为结果,那么我将了解有关projection-expression的信息,并尝试执行查询(query.json):

{
    ":Id":{"S":"1234"}
}
Run Code Online (Sandbox Code Playgroud)

aws cli命令

aws dynamodb query --table-name sensorData --key-condition-expression "sensorId= :Id" --expression-attribute-values file://query2.json --projection-expression "timestamp"
Run Code Online (Sandbox Code Playgroud)

给我 :

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

但是出于测试目的,将“ timestamp”替换为“ sensorId”给了我:

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

而且我了解到sensorId对于键表达式无效。。KeyConditionExpression仅接受键属性,哈希键和范围键。但是如何得到结果呢?

我只需要sensorId的时间戳。我的主键错了吗?最好使用sensorId作为主键以及将时间戳作为范围键?

Ash*_*han 5

根据您的方案,最好更改密钥。使用SensorID作为分区键,并使用时间戳作为排序键。

这样,您可以查询(不扫描所有项目)给定SensorID的项目。也可以按时间戳顺序对它们进行排序。

如果您有一个较大的数据集(超过几个千字节),则创建LSI或GSI来投影给定查询所需的属性将很有效。

注意:TimeStamp是DynamoDB中的保留字。您可以使用表达式属性名称来避免在查询表达式中使用保留属性时出现错误。