Nic*_*ani 3 amazon-web-services amazon-dynamodb aws-lambda
所以,我使用 AWS Lambda 和 node.js 与 DynamoDB 交互,到目前为止一切都很好,因为我可以进行扫描、使用主键查询等等。
但是,现在我需要做一个我不知道主键的查询或扫描,我只有列的名称,我想按该列过滤的参数和表名。
例如在 SQL 语言中:
SELECT * FROM user WHERE user_type = 'Moderator';
Run Code Online (Sandbox Code Playgroud)
我已经搜索了文档,但我仍然无法做到这一点。有人能帮我吗?
DynamoDB 是一个 NoSQL 数据库。NoSQL 数据库与传统关系型(即 SQL)数据库之间的区别在于,您可以获得更快的性能,但这是以失去运行复杂查询的灵活性为代价的。如果您需要对数据运行复杂的查询,则不应使用 DynamoDB,因为它不是满足您要求的正确工具。
在 DynamoDB 中,您只能对关键属性运行查询。否则,您将必须运行扫描以返回整个表,然后您可以对数据执行任何您想要的操作,例如过滤结果。
DynamoDB 中的每张表通常至少有一个键,即主键,也称为哈希键或分区键。但是您也可以有一个范围键,也称为排序键。在您的示例中,如果 UserType 是排序键,则在运行查询后,DynamoDB 将返回 UserType 与“Moderator”相等的所有分区中的所有行。
但是你也可以在你的表上定义二级索引。辅助键可以是全局辅助键或本地辅助键。这为您运行查询提供了更大的灵活性。有关更多详细信息,请参阅 DynamoDB 文档:
http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/SecondaryIndexes.html
总结:如果您无法控制 DynamoDB 表的设计,那么您可能只能运行扫描。否则,请考虑重新设计表索引和键以满足您的要求。
执行此操作的几种方法,取决于您的应用程序执行此查询的频率以及您对性能的关心程度,我将从最不费力但可扩展性最低到最费力但可扩展性最高。
使用过滤器和投影表达式扫描表- 因此 dynamo 根据分区键对您的数据进行分片,除非配置,否则不保留索引。因此,在没有任何额外表配置的情况下获得所有版主的完整列表的唯一方法是执行消耗大量 IOPS 的全表扫描,但如果这是偶尔的事情,这可能没问题。您可以添加“过滤器表达式”让 dynamo 只向您返回“user_type” = 'Moderator' 但在后端 dynamo 仍在扫描整个数据库的结果,它使过程更快,因为传输结果所需的时间更少,但它消耗了相同的 IOPS .. 你可以更进一步,使用“投影表达式”过滤只从每一行返回“user_name”字段。(如果您处理大型项目,这会很有帮助。这也不会减少消耗的 IOPS 量,但会减少返回给您的不必要的数据。尽管这种方法不会很好地扩展,即使只有 2 个主持人。 .. 数据库中的用户越多,它就会变得越来越慢。
添加全局二级索引这是中间立场,但它也需要成本,因为您需要为索引提供足够的 IOPS 以跟上,但这里的事情更可控。您可以使用不同的分区键查看您的表的不同视图,但请注意,即使对于您的索引,您也需要一个散列的分区键以及它基本上是另一张桌子。“user_type”不能很好地散列,所以你可以做的是有一个名为“moderator_name”的字段,它与“user_name”具有相同的值,但只存在于作为主持人的用户上。接下来,您在此字段上创建二级索引,该索引中将仅存在版主。然后您可以扫描此索引,以获取您的主持人列表,并且它不会消耗主表上的任何 IOPS。这可能看起来有点 hacky,但是对于 Dynamo,它不像 SQL,如果您构建一个良好的表结构,它可以处理任何查询,您需要专门构建您的 Dynamo 表以匹配您期望执行的读取和写入类型......所以这导致下一个选项
创建一个单独的“版主”表这是更多的工作开始,但如果您想将版主特定功能添加到您的站点,这可能是更好的方法。如果你这样做,我建议你的主表中不要有“user_type”,而只是查询这个表,如果用户存在于其中,他们就是主持人。这样做的原因是,如果没有 SQL 事务来组合写入,则您的“user_type”字段和 Moderators 表可能会变得不一致。
使用 Dynamo Streams 将您的数据导出到 SQL DB,而 Dynamo 非常适合许多用例,它不是 SQL DB,并且为了性能和可扩展性而牺牲了许多不错且方便的 SQL 功能。再次让您的网站使用可能有意义Dynamo 的速度和创建有针对性的电子邮件活动在 SQL 数据库中具有相同的数据,因此您可以执行复杂的查询来创建针对特定用户子集的电子邮件活动。
在不同的情况下,我使用了所有 4 种方法,需要强调的是“......取决于你的用例......”
| 归档时间: |
|
| 查看次数: |
1949 次 |
| 最近记录: |