【问题标题】:DynamoDB: Query for range key in a set of non-sequential range keysDynamoDB:在一组非顺序范围键中查询范围键
【发布时间】:2017-04-01 18:27:09
【问题描述】:

我有一个使用哈希键和排序(范围)键的表。我的范围键是一个 uuid。我有一个案例,我有一组任意范围键,我想查询数据库以使用 DynamoDBMapper。它们绝不是连续的,不幸的是,就我的目的而言,它们不可能是连续的,所以我无法查询一系列键(即键在 a 和 b 之间)。有没有办法让查询条件搜索一组潜在值中的范围键?本质上是一个 sql WHERE 条件,例如:rangeKey IN (val1, val2, ...);

根据DynamoDBQueryExpression 的文档,这似乎无法使用 setKeyConditionExpression 或 setRangeKeyConditions。有没有有效的方法来做到这一点?还是我最好的选择是遍历我的一组潜在值并使用 load 方法从数据库中单独检索它们?

【问题讨论】:

  • 你能分享更多关于你的数据模型的细节吗?使用 uuid 作为范围键似乎有点奇怪,因为它们没有自然顺序。
  • 我第二次 hellomichibye 的评论。听起来您的数据模型需要一些工作。使用 UUID 作为范围键没有意义。
  • 我同意这并不理想,但它是我们提出的最佳解决方案。我们为通过散列键访问的不同客户提供数据库分区。在分区内,所有文档都非常独立,因此任何排序或排序都是任意的。之所以需要此查询,是因为我们有一个将多个文档与另一个实体相关联的参考表。但是,引用该实体的文档经常更改,因此任何排序或排序都是非常随意的。

标签: amazon-web-services amazon-dynamodb


【解决方案1】:

Query 不支持IN 操作,根据文档here

排序键条件必须使用以下比较之一 运营商:

  • a = b — 如果属性 a 等于值 b,则为 true
  • a
  • a
  • a > b — 如果 a 大于 b,则为 true
  • a >= b — 如果 a 大于或等于 b,则为 true
  • a BETWEEN b AND c — 如果 a 大于或等于 b 且小于或等于 c,则为 true。

还支持以下功能:

begins_with (a, substr) — 如果属性 a 的值以 一个特定的子字符串。

此外,您始终需要确切的哈希键来执行Query。如果这对您的用例来说没问题,您应该QueryDynamoDB 并在应用层应用IN 过滤器。

如果您没有确切的哈希键,则执行Scan,它确实具有用于过滤的IN 操作。文档here

【讨论】:

  • 我就是这么想的。我总是有哈希键,当前的实现正是你上面所说的,我只是希望有一种更有效的本地方式来做到这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多