0

我在一张桌子上有数千个项目。每个项目都有一个数字属性score。我想做的事:

  1. 给定一些targetScore,选择所有项目targetScore - n <= score <= targetScore + n(我让这部分工作)。
  2. 仅返回按 ASC 顺序排列的第一个j元素j := ABS(targetScore - score)

由于表有点大,并且只会随着时间的推移而增长,我希望有一种方法可以将上面的第 2 步委托给 DynamoDB 引擎。我目前正在从第 1 步中选择所有项目 ID,正在为第 2 步进行计算,然后在后续查询中选择结果项目。

4

1 回答 1

1

您实际上并不需要第 1 步来获得第 2 步。我假设这score是您设置中的排序键。

在第 2 步中,您想要对项目进行排序abs(targetScore - score)并取j最低的项目。

尽管 DynamoDB 没有任何直接的方法可以做到这一点,但绝对值的定义使它很容易做到。首先,观察`abs(targetScore - score)的定义如下:它是:

  1. targetScore - score如果score <= targetScore
  2. score - targetScore如果score >= targetsScore

因此,abs 最小的项目要么是得分高于targetScore但尽可能低的项目,要么是得分低于targetScore但尽可能高的项目。

因此,您可以执行两个单独的 DynamoDB 查询:

  1. 用查询第一个j项目score >= targetScore,按递增 score排序。
  2. 查询带有 的第一jscore < targetScore,按降序 score排列。

DynanoDB 可以有效且廉价地为您执行这两种查询 - 它涉及Query带有KeyConditions参数的 a 和 a Limit,并ScanIndexForward进行递减排序。但没有昂贵和低效FilterExpression

一旦你拥有了j每个类型 1 和类型 2 的最小项目,剩下的就是从我们得到j的这些项目中选择整体最小的项目。2*j

于 2020-08-11T17:20:05.183 回答