DynamoDB主键时间戳

时间:2018-03-25 22:18:23

标签: amazon-dynamodb aws-cli primary-key-design

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

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

此Json通过CLI命令使用:

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

那是成功的,并且给了我指定的感应器的所有数据。

现在,如果我想只有timestamp和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"

给我:

  

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

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

  

调用Query时发生错误(ValidationException)   operation:查询条件错过了key schema元素:timestamp

我明白sensorId对key-expression无效。 KeyConditionExpression仅接受键属性,散列键和范围键。 但是如何得到结果?

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

1 个答案:

答案 0 :(得分:5)

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

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

如果你有一个更大的数据集(超过几个Killobytes),那么创建一个LSI或GSI来为给定的查询投射所需的属性是有效的。

注意:TimeStamp是DynamoDB中的reserved word。在查询表达式中使用保留属性时,可以使用Expression Attribute Names来避免错误。