amazon-dynamodb - 使用动态值对 DynamoDB 中的项目进行排序?
问题描述
我在一张桌子上有数千个项目。每个项目都有一个数字属性score
。我想做的事:
- 给定一些
targetScore
,选择所有项目targetScore - n <= score <= targetScore + n
(我让这部分工作)。 - 仅返回按 ASC 顺序排列的第一个
j
元素j := ABS(targetScore - score)
。
由于表有点大,并且只会随着时间的推移而增长,我希望有一种方法可以将上面的第 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
参数的 a 和 a Limit
,并ScanIndexForward
进行递减排序。但没有昂贵和低效FilterExpression
!
一旦你拥有了j
每个类型 1 和类型 2 的最小项目,剩下的就是从我们得到j
的这些项目中选择整体最小的项目。2*j
推荐阅读
- javascript - JavaScript 括号解释
- c# - 如何在 c# 模型中的 typescript 中转换 propName: string: any?
- ruby - 在 Windows 上安装 ruby 版本 2.1.2 没有成功
- ruby-on-rails - 在Rails中提交表单之前,有没有办法覆盖选择中禁用选项的id
- java - Double.parseDouble 丢失小数位
- javascript - jQuery 表单验证在 JSP 中不起作用
- c++ - CLion 在远程计算机上找不到 C/C++ 标准库
- react-native - 如何在 React Native WebView 中加载视图之前在 WebView 本地存储中设置值
- dart - 如何从推送通知重定向到颤动的页面
- python - 为什么这段代码不输出获胜者变量?