Amazon dynamodb Dynamodb:如何高效地查询主键组中的行数?

Amazon dynamodb Dynamodb:如何高效地查询主键组中的行数?,amazon-dynamodb,Amazon Dynamodb,我有一个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

我有一个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
在伪代码中,我想查询如下内容:

createdAt中用户ID的记录数:3746241188984046< 2017-04-19T00:00:00.000000001Z和createdAt> 2017-04-16T00:00:00.000000001Z

返回类似于他的结果:

{
  374624 => 2,
  4046 => 3,
  118898 => 0
}
如何使用dynamoDB有效地完成这项工作?我可以创建一个索引,让我更容易做到这一点吗?
如果我需要为1000个用户ID这么做怎么办?

DyanmoDB基本上提供了两种访问数据的方法。可以通过散列(分区)键访问数据,因此速度很快。若使用查询,则必须指定一个且只能指定一个哈希键,这意味着您只能通过一个查询从一个分区检索数据。您可以选择指定其他参数以缩小分区内的结果范围。例如,您可以为排序键提供一个范围

关键字条件表达式

指定键值的条件 对于要由查询操作检索的项

该条件必须对单个分区键执行相等测试 价值观

条件可以选择执行几个比较测试之一 在单个排序键值上。这允许查询检索一个项目 具有给定的分区键值和排序键值,或若干项 具有相同分区键值但不同排序键值的

分区键相等测试是必需的,必须在中指定 以下格式:

partitionKeyName=:partitionkeyval

其他选择是。扫描总是对表中的每个项目进行评估,因此通常速度较慢,并且不能很好地扩展。使用扫描,您可以在一次通话中获取数据,但效率低下

总之,您应该进行大量的查询调用,其中每个调用都有一个哈希键,并且每个查询中的条件都相同。然后将所有结果合并到一个列表中


编辑:您可以使用按其(复合)主键检索一个项目。您可以使用一次检索多个项目。但不幸的是,没有BatchQuery。

将每个用户ID作为关键条件进行查询,并按排序键进行筛选,仅对用户ID进行投影,dynamodb上的每个查询返回一个计数:
这是处理此表结构最有效的方法。

因此,遗憾的是,我无法处理dynamo db。你能想出任何方法,我可以通过制作替代索引或其他东西来更有效地实现这一点吗?你肯定可以在DynamoDB中实现这一点。您只需要将范围键和分区键传递给一个定制函数,该函数将遍历键并对每个键进行查询,然后将结果添加到一个列表中并返回该列表。代码不多。但是没有,没有办法在一次呼叫中完成(除了扫描,这可能很慢而且很昂贵)。我不认为有任何快速的解决方法-DynamoDB只是不打算像SQL那样强大。如果使用正确,在很多情况下它会更快。你能看到其他的结构化或索引方法吗?这些方法可以提高性能(我真的不想发出1k请求:-)