我需要设计一个DynamoDB模式来存储其属性为:
tid
timestamp
以及<=
上的关系排序表达式(例如BETWEEN
,timestamp
等)进行查询。也就是说,查询特定日期时间范围内的所有项目 ,而无需事先知道它们的tid
。这是否有可能在DynamoDB中高效地完成,还是有另一个AWS解决方案可以更好地为我服务?
答案 0 :(得分:0)
给出DynamoDB表,如下所示:
{}
,键入字符串tid
,键入字符串您可以查询:
使用awscli进行尝试,例如使用timestamp
查询所有项目:
tid=5
要查询aws dynamodb query \
--table-name mytable \
--key-condition-expression "tid = :tid" \
--expression-attribute-values '{":tid":{"S":"5"}}'
和tid=5
的所有项目:
timestamp between 09:00 and 15:00 on 2015-12-21
注意:由于aws dynamodb query \
--table-name mytable \
--key-condition-expression "tid = :tid AND #ts BETWEEN :ts1 AND :ts2" \
--expression-attribute-values '{":tid":{"S":"5"}, ":ts1":{"S":"2015-12-21T09:00:00Z"}, ":ts2":{"S":"2015-12-21T15:00:00Z"}}' \
--expression-attribute-names '{"#ts":"timestamp"}'
在DynamoDB中是reserved keyword,因此必须使用表达式属性名称对其进行转义。
如果愿意,还可以将timestamp
属性创建为数字,然后存储纪元时间。
要使用timestamp
查询所有项目,而无论timestamp between 09:00 and 15:00 on 2015-12-21
是什么,都无法使用相同的分区/排序键架构来完成。您将需要添加Global Secondary Index这样的内容:
tid
,键入字符串yyyymmdd
,键入字符串现在,您可以查询具有给定时间戳范围的项目,只要它们在同一天(它们具有相同的YYYYMMDD,这可能是一个合理的限制)。或者,您可以将YYYYMM作为分区键,以允许更大的时间戳范围。此时,您确实需要了解查询的用例,以确定YYYYMMDD(将查询限制在一天之内)是否正确。有关此想法的更多信息,请参见How to query DynamoDB by date with no obvious hash key。