NodeJS DynamoDB对数据排序

kuhbmx9i  于 2023-01-01  发布在  Node.js
关注(0)|答案(1)|浏览(137)

无论我在哪里看到,网络都告诉我不要在dynamoDB中使用scan(),它使用了所有的容量单位,1 mb的响应大小等等。
我已经研究过查询,但这也不能达到我的目的。
我该如何解析我的表呢?
这是我的设置-我有一个表“人”与行的人。
我有属性“email”(分区键)、“fName”、“lName”、“display Name”、“passwordHash”和“subscribed”。
subscribed不是true就是false,我需要对订阅的每个人进行排序。
我无法使用排序键,因为所有电子邮件都是唯一的...
据我所知,DynamoDB数据按如下方式排序:
主键-

  • 排序键1
    ---项目1
  • 排序键2
    ---项目2
    主键2
  • 分类表1
    ..等等。
    因此,将subscribed设置为sortket将不起作用...我仍然需要循环遍历每个主键。
    现在,我只是用filterExpression获取每个条目,以检查是否有人订阅了。如果有人订阅了,他们就通过了。但是,如果我有数百个用户,他们的数据超过了1 mb,会发生什么呢?
    在这种情况下,我无法获取订阅的每个用户,而且使用start键重复发送请求以获取每个Mb的数据对于处理器来说太繁琐了,而且会显著降低服务器的速度
    对于我应该如何获得每一个订阅用户,有什么建议吗?
    注意:Subscribed不能是主键,而email不能是排序键,因为我有一些示例只需要用户,如果email是主键,那么用户很容易访问。
ttp71kqs

ttp71kqs1#

现在,我只是用filterExpression获取每个条目,以检查是否有人订阅了。如果有人订阅了,他们就通过了。但是,如果我有数百个用户,他们的数据超过了1mb,会发生什么呢?

GetItem用于单个人员查找

理想情况下,您应该在此处使用GetItem,方法是提供用户电子邮件作为搜索参数,然后检查他们是否已订阅。扫描以查看个人是否已订阅是不可伸缩的。

分页

当数据超过1MB时,您只需分页:https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Scan.html
对于我应该如何获得每一个订阅用户,有什么建议吗?

稀疏索引

对于这个用例,最好使用稀疏索引,其中subscribed="true"仅在为真时才设置,如果为假则不设置(您还必须使用字符串,因为布尔值不能用作键)。
一旦你这样做了,你就可以在订阅的属性上创建一个GSI,现在只有那些为真的项包含在你的GSI中,使它变得稀疏。所以在那个值上的Scan现在使它尽可能的高效,尽管它会将吞吐量限制在1000 WCU。

让一切变得可扩展

一个更好的方法是创建一个名为GSI_PK的属性,并为它分配一个随机数。然后使用subscribed作为排序键,再次使用字符串,并且仅当为true时使用。这意味着您的索引不会成为瓶颈,也不会因为分区键为单个值而将吞吐量限制为1000 WCU。
https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/bp-indexes-general-sparse-indexes.html

相关问题