3

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

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

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

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

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

现在,如果我只想获得时间戳和 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):Invalid ProjectionExpression: Attribute name is a reserved keyword;保留关键字:时间戳

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

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

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

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

4

1 回答 1

9

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

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

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

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

于 2018-03-26T02:50:10.953 回答