[英]Sorting items from DynamoDB using dynamic value?
我在一张桌子上有数千个项目。 每个项目都有一个数字属性score
。 我想做的事:
targetScore
, select targetScore - n <= score <= targetScore + n
的所有项目(我让这部分工作)。j:= ABS(targetScore - score)
的前j
个元素。由于表有点大,并且只会随着时间的推移而增长,我希望有一种方法可以将上面的第 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 查询:
score >= targetScore
的前j
个项目,按score
递增排序。score < targetScore
的前j
个项目,按score
递减排序。 DynanoDB 可以高效且廉价地为您执行这两种查询 - 它涉及一个带有KeyConditions
参数和一个Limit
的Query
以及ScanIndexForward
来进行递减排序。 但没有昂贵且低效FilterExpression
!
一旦你有了每个类型 1 和类型 2 的j
个最小的项目,剩下的就是从我们得到的这2*j
个项目中选择整个j
最小的项目。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.