如何解决使用动态值对DynamoDB中的项目进行排序?
我的桌子上有数千个物品。每个项目都有一个数字属性score
。我想做什么:
- 给出一些
targetScore
,选择所有targetScore - n <= score <= targetScore + n
(我使这部分正常工作)的所有项目。 - 仅返回前
j
个元素,其中j := ABS(targetScore - score)
按ASC顺序。
由于表有些大,并且只会随着时间的推移而增长,所以我希望有一种方法可以将上面的步骤2委托给DynamoDB引擎。我目前正在从步骤#1中选择所有商品ID,对正在进行的步骤#2进行计算,然后在随后的查询中选择生成的商品。
解决方法
您真的不需要第1步就可以得到第2步。我假设score
是您设置中的排序键。
在步骤2中,您要按abs(targetScore - score)
对项目进行排序,并选择j
最低的项目。
尽管DynamoDB没有任何直接方法可以执行此操作,但是绝对值的定义使其非常容易执行。首先,观察`abs(targetScore-score)的定义如下:它是:
-
targetScore - score
,如果score <= targetScore
-
score - targetScore
,如果score >= targetsScore
因此,具有最小Abs的项目是 得分高于targetScore
但得分尽可能低的项目或得分低于targetScore
,但尽可能高。
因此,您可以进行两个单独的DynamoDB查询:
- 使用
j
查询前score >= targetScore
个项目,以递增score
的形式排序。 - 使用
j
查询前score < targetScore
个项目,以减少score
的形式排序。
DynanoDB可以高效,廉价地为您执行两种查询-它涉及到带有参数Query
和KeyConditions
的{{1}}和Limit
来进行递减排序。但是没有昂贵且效率低下的ScanIndexForward
!
一旦您拥有每种类型1和类型2的FilterExpression
个最小项目,剩下的就是从我们得到的这些j
个项目中选择总体j
个最小项目。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。