如何在nodejs中的DynamoDB中按属性获取项目
How Can I get Item by Attribute in DynamoDB in nodejs
我有 7 列,
id, firstname, lastname, email, phone, createAt, updatedAt
我正在尝试在 Nodejs 中编写 api 以通过 phone
获取项目。
id
是主键。
我正在尝试通过 phone 或电子邮件获取数据。我还没有创建 sortkey 或 GSI。
我最终得到了在 dynamodb 中使用 scan
过滤器并获取所有记录的建议。
还有其他方法可以实现吗?
您的问题已经包含两个很好的答案:
- 较慢的方法是使用
Scan
和 FilterExpression
来查找匹配项。这将花费时间(还有成本!)在每次查询时读取整个数据库。只有在这些查询非常少见的情况下才有意义。
- 如果
phone
的这些查询不是super-rare,最好提前准备:添加一个以phone
为分区键的GSI,以便查找使用 Query
与 IndexName
和 KeyConditionExpression
的 phone 值的项目。这些查询将快速且便宜:您只需为实际检索到的项目付费。这种方法的缺点是增加了写入成本:成本
每次写入都翻倍(DynamoDB 写入基 table 和
索引),并且存储成本也会增加。但除非
您的工作量是 write-mostly(项目更新非常频繁并且
很少阅读),选项 2,使用 GSI,仍然比
选项 1 - full-table Scan
.
您最后的另一个选择是重新考虑您的数据模型。例如,如果您总是按 phone
而从不按 id
查找项目,则可以将 phone
设为数据的分区键,将 id
设为排序键(以允许具有相同 phone
的多个项目)。但我不知道这是否与您的用例相关。如果您有时需要通过 id
查找项目,有时需要通过 phone
查找项目,GSI 可能正是您所需要的。
我有 7 列,
id, firstname, lastname, email, phone, createAt, updatedAt
我正在尝试在 Nodejs 中编写 api 以通过 phone
获取项目。
id
是主键。
我正在尝试通过 phone 或电子邮件获取数据。我还没有创建 sortkey 或 GSI。
我最终得到了在 dynamodb 中使用 scan
过滤器并获取所有记录的建议。
还有其他方法可以实现吗?
您的问题已经包含两个很好的答案:
- 较慢的方法是使用
Scan
和FilterExpression
来查找匹配项。这将花费时间(还有成本!)在每次查询时读取整个数据库。只有在这些查询非常少见的情况下才有意义。 - 如果
phone
的这些查询不是super-rare,最好提前准备:添加一个以phone
为分区键的GSI,以便查找使用Query
与IndexName
和KeyConditionExpression
的 phone 值的项目。这些查询将快速且便宜:您只需为实际检索到的项目付费。这种方法的缺点是增加了写入成本:成本 每次写入都翻倍(DynamoDB 写入基 table 和 索引),并且存储成本也会增加。但除非 您的工作量是 write-mostly(项目更新非常频繁并且 很少阅读),选项 2,使用 GSI,仍然比 选项 1 - full-tableScan
.
您最后的另一个选择是重新考虑您的数据模型。例如,如果您总是按 phone
而从不按 id
查找项目,则可以将 phone
设为数据的分区键,将 id
设为排序键(以允许具有相同 phone
的多个项目)。但我不知道这是否与您的用例相关。如果您有时需要通过 id
查找项目,有时需要通过 phone
查找项目,GSI 可能正是您所需要的。