DynamoDB 主键时间戳

DynamoDB primarykey timestamp

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

{
"sensorId": {
    "AttributeValueList": [{
        "S": "1234"
    }],
    "ComparisonOperator": "EQ"
}
  }

这个 Json 是通过 CLI 命令使用的:

aws dynamodb scan --table-name sensorData --scan-filter file://scan.json 

成功并为我提供了指定传感器 ID 的所有数据。

现在,如果我只想得到时间戳和 sensorId 作为结果,我阅读了有关 projection-expression 的内容并尝试进行查询 (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"

给我:

An error occurred (ValidationException) when calling the Query operation: Invalid ProjectionExpression: Attribute name is a reserved keyword; reserved keyword: timestamp

但是为了测试目的用“sensorId 替换 "timestamp" 给了我:

An error occurred (ValidationException) when calling the Query operation: Query condition missed key schema element: timestamp

我知道 sensorId 对键表达式无效.. KeyConditionExpression 只接受键属性、散列键和范围键。 但是如何得到结果呢?

我只想要 sensorId 的时间戳。 我的主键错了吗?应该更好地使用 sensorId 作为主键和时间戳作为范围键?

根据你的情况,换个密钥比较好。使用 SensorID 作为分区键,使用时间戳作为排序键。

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

如果您有更大的数据集(超过几 Killobytes),创建 LSI 或 GS​​I 来投影给定查询所需的属性会很有效。

注意:时间戳是reserved word in DynamoDB. You can use Expression Attribute Names以避免在查询表达式中使用保留属性时出现的错误。