DynamoDB 主键时间戳

3

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

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

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

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

操作成功,我获得了指定传感器ID的所有数据。

现在如果我只想要时间戳和传感器ID作为结果,我了解到可以使用投影表达式(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"

给我的信息是:

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

但是将“timestamp”替换为“sensorId”以进行测试目的,我得到了以下结果:

调用查询操作时发生错误(ValidationException):查询条件缺少关键模式元素:timestamp

我明白sensorId不适用于关键表达式。 KeyConditionExpression仅接受关键属性、哈希键和范围键。 但是如何获得结果呢?

我只想要一个传感器ID的时间戳。 我的主键是错误的吗?使用sensorId作为主键,同时将时间戳作为范围键更好吗?

1个回答

9
根据您的情况,建议修改密钥。将SensorID用作分区键,Timestamp用作排序键。
这样,您可以查询给定SensorID的项(而无需扫描所有项)。同时,也可以按照时间戳对它们进行排序。
如果您有更大的数据集(超过几千字节),则创建LSI或GSI以展示所需的属性对于给定的查询非常有效。
注意:在DynamoDB中,TimeStamp是一个保留字。您可以使用表达式属性名称来避免在查询表达式中使用保留属性时出现错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接