如何在nodejs中使用DynamoDB按属性获取项目

3

我有7列,

id, firstname, lastname, email, phone, createAt, updatedAt

我正在尝试使用Nodejs编写API,以通过phone获取项目。 id是主键。
我试图通过电话或电子邮件获取数据。 我还没有创建排序键或GSI。
最终,我得到了建议,在dynamodb中使用带有过滤器的scan并获取所有记录。
还有其他方法可以实现吗?
1个回答

6
你的问题已经包含了两个好的答案:
  1. 慢速方法是使用一个带有FilterExpressionScan来查找匹配项。这将花费读取每个查询时整个数据库的时间(也会消耗更多的费用)。只有在这些查询非常不经常发生时才有意义。
  2. 如果按照电话查询不是非常罕见,则最好提前准备:添加以phone为其分区键的GSI,以允许使用IndexNameKeyConditionExpression通过Query查找按电话值索引的项目。这些查询将快速且便宜:您只需支付实际检索到的项目。这种方法的缺点是写入成本增加:每次写入的成本都会翻倍(DynamoDB同时写入基表和索引),存储成本也增加了。但除非你的工作负载主要是写入(项非常频繁地更新并且很少读取),否则选项2-使用GSI仍然比选项1-全表Scan更好。

最后,另一个选择是重新考虑数据模型。例如,如果你总是按phone查找项目而从不按id查找,你可以将phone作为数据的分区键,而将id作为排序键(以允许具有相同phone的多个项目)。但我不知道这是否与你的用例相关。如果你需要按idphone查找项目,那么可能GSI正是你所需要的。


谢谢Nadav Har'EI,那真是太棒了。我宁愿选择将电话作为主键,以避免GSI成本。非常感谢。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接