使用动态值对DynamoDB中的项目进行排序?

问题描述

我的桌子上有数千个物品。每个项目都有一个数字属性score。我想做什么:

  1. 给出一些targetScore,选择所有targetScore - n <= score <= targetScore + n(我使这部分正常工作)的所有项目。
  2. 仅返回前j个元素,其中j := ABS(targetScore - score)按ASC顺序。

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

解决方法

您真的不需要第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. 使用j查询前score < targetScore个项目,以减少 score的形式排序。

DynanoDB可以高效,廉价地为您执行两种查询-它涉及到带有参数QueryKeyConditions的{​​{1}}和Limit来进行递减排序。但是没有昂贵且效率低下的ScanIndexForward

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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...