我有一个存储数百万个事件的dynamoDB表
该表有一个主键和一个排序键:
Primary partition key userID (Number)
Primary sort key createdAt (String)
表格看起来像这样:
userID createdAt someAttr
374624 2017-04-17T20:16:41.695884945Z abc
374624 2017-04-16T22:13:12.611114945Z abc
374624 2017-04-20T20:18:15.695874945Z abc
4046 2017-04-15T20:12:01.695814945Z abc
4046 2017-04-17T20:16:22.195684945Z abc
118898 2017-04-19T20:11:42.695874945Z abc
4046 2017-04-17T20:14:41.192884945Z abc
118898 2017-04-14T20:17:18.695784945Z abc
118898 2017-04-13T20:03:41.295484945Z abc
4046 2017-04-18T20:22:32.395784945Z abc
118898 2017-04-30T20:08:41.595814945Z abc
118898 2017-04-20T20:15:52.695784945Z abc
在伪代码中,我想查询类似的内容:
userIDs的记录数:374624,118888,4046 within createdAt< 2017-04-19T00:00:00.000000001Z AND createdAt> 2017-04-16T00:00:00.000000001Z
返回像他一样的结果:
{
374624 => 2,
4046 => 3,
118898 => 0
}
如何使用dynamoDB高效地完成此操作?我可以创建一个能让我更容易做到的索引吗? 如果我需要为1000个用户ID执行该怎么办?
答案 0 :(得分:1)
DyanmoDB本质上提供了两种访问数据的方法。 Query可用于通过哈希(分区)密钥访问数据,因此速度很快。如果使用查询,则必须指定一个且仅指定一个哈希键,这意味着您只能通过一个查询从一个分区中检索数据。您可以选择指定其他参数以缩小分区内的结果范围。例如,您可以为排序键提供范围。
KeyConditionExpression
指定键值的条件 查询操作要检索的项目。
条件必须对单个分区键执行相等性测试 值。
条件可以选择执行多个比较测试之一 在单个排序键值上。这允许Query检索一个项目 具有给定的分区键值和排序键值,或多个项目 具有相同分区键值但具有不同排序键值的值。
需要分区键相等性测试,并且必须在中指定 格式如下:
partitionKeyName =:partitionkeyval
其他选项是Scan.。扫描总是评估表中的每个项目,因此它通常很慢并且不能很好地扩展。使用扫描,您可以在一次通话中获取数据,但效率很低。
总而言之,您应该进行大量的Query调用,其中每个调用都有一个哈希键,并且每个Query中的条件都相同。然后将所有结果合并到一个列表中。
编辑:您可以使用GetItem通过其(复合)主键检索一个项目。您可以使用BatchGetItem一次检索多个项目。但遗憾的是没有BatchQuery。
答案 1 :(得分:1)
查询每个userId作为您的关键条件,并按排序键过滤,仅针对您的userIds投影,每个Dynamodb上的查询返回一个计数:https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Query.html#Query.Count 对于您希望对此表结构执行的操作,这是最有效的方法。