我试图在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作为主键以及时间戳作为范围键吗?
答案 0 :(得分:5)
根据您的情况,更好地更改密钥。使用SensorID作为分区键和时间戳作为排序键。
通过这种方式,您可以查询(不扫描所有项目)给定SensorID的项目。还可以按时间戳的顺序对它们进行排序。
如果你有一个更大的数据集(超过几个Killobytes),那么创建一个LSI或GSI来为给定的查询投射所需的属性是有效的。
注意:TimeStamp是DynamoDB中的reserved word。在查询表达式中使用保留属性时,可以使用Expression Attribute Names来避免错误。