如何查询DynamoDB中每一列的计数

时间:2019-04-04 21:11:02

标签: node.js aws-lambda amazon-dynamodb

我有一个DynamoDB,其中有50个不同的列,分别标记为问题1-问题50。这些列中的每一个都有abcd作为答案选择题。获取对问题1回答“ a”的人数的最有效方法是什么?

我正在尝试针对所有问题返回abcd的数量,所以我想看看有多少回答{{1 }}代表问题1,有多少回答a代表问题1,依此类推。因此,最后我应该对每个问题及其答案进行计数。

目前我有这个,但我觉得输入所有内容并不高效。有简化的方法吗?

b

3 个答案:

答案 0 :(得分:0)

RDBMS的聚合非常容易... DDB没那么多。

DDB通常的答案是启用流,并在流上附加一个lambda,以计算所需的聚合并将其存储在DDB的单独记录中。

通读文档的Using Global Secondary Indexes for Materialized Aggregation Queries部分。

答案 1 :(得分:0)

您错过了提及两件事-这是您的一次性手术还是您需要定期进行?你有几条记录?

如果这是一次操作:

由于您有50个问题,每个问题有4个选项(200个组合),并且假设您有很多数据,所以最简单的解决方案是导出entire data to a csv并在那里做数据透视表。这比扫描整个表并在内存中执行聚合操作要容易。或者,您可以将表作为json导出到s3并使用athena对数据运行查询。

如果需要定期执行此操作,则可以执行以下操作之一:

  • 将总计计数保存为GSI在同一表或新表中或完全在其他地方。启用流并将其发送到lambda函数。根据传入的新数据增加这些计数。
  • 使用弹性搜索-在ddb上启用流,并具有lambda函数将其发送到弹性搜索索引。索引当前数据。然后对这个索引进行汇总查询。

答案 2 :(得分:-1)

如此处https://stackoverflow.com/a/55553744/6723229所述,如果您想执行一次操作,则可以将其导出到S3并使用AWS Athena来运行查询。这很好,但代价昂贵,并且如果您希望将来会发生变化,则需要执行模式。

如果您要定期执行此操作,有更多数据输入并且不想每次都导出,则可以使用Rockset之类的服务。 Rockset与DynamoDB进行了实时集成,可用于使DynamoDB和Rockset之间的数据保持同步。数据放入Rockset后,您可以使用SQL进行有效查询。 Rockset将索引所有字段并执行快速聚合。

在此处https://rockset.com/blog/running-fast-sql-on-dynamodb-tables/有关如何进行设置。

免责声明:我在Rockset工作。