2017-02-10 71 views
0

我有一个使用散列键和排序(范围)键的表。我的范围键是一个uuid。我有一个我想要查询数据库以使用DynamoDBMapper的任意一组范围键的情况。它们绝不是连续的,不幸的是,对我而言,它们不可能是连续的,所以我不能查询一系列的键(即键在a和b之间)。有什么办法可以有一个查询条件来搜索一组潜在值中的范围键?本质上是一个SQL WHERE条件,如:rangeKey IN(val1,val2,...);DynamoDB:在一系列非连续范围键中查询范围键

根据DynamoDBQueryExpression的文档,使用setKeyConditionExpression或setRangeKeyConditions似乎不可能。有没有这样做的有效方法?或者,我最好的办法是迭代我的潜在值集合,并使用load方法从数据库中单独检索它们?

+3

你能分享一些关于你的数据模型的更多细节吗?使用uuids作为范围键似乎有点奇怪,因为它们没有自然顺序。 – hellomichibye

+0

我第二hellomichibye的评论。这听起来像你的数据模型需要一些工作。使用UUID作为范围键是没有意义的。 –

+0

我同意这不是理想的,但它是我们想出的最佳解决方案。我们为通过散列键访问的不同客户提供数据库分区。在分区内,所有文档都相互独立,因此任何排序或排序都是任意的。此查询是必需的,因为我们有一个将多个文档关联到另一个实体的引用表。但是,对该实体的参考文档经常变化,所以任何排序或排序都是非常随意的。 –

回答

1

IN操作没有Query支持作为每文档here

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

  • A = B - 如果真属性a等于值b
  • a < b - 如果a小于b,则为true
  • 一个< = B - 如果a小于或等于b
  • A> B - 如果A比B
  • 更高的> = B - 如果a大于等于b
  • a BETWEEN b和c - 如果a大于或等于b且小于或等于c,则为true。

下面的函数也被支持:

BEGINS_WITH(一,SUBSTR) - 如果属性的值与 特定串开始真。

此外,你总是需要一个确切的散列键来做Query。如果您的用例没有问题,则应在应用程序层应用Query DynamoDB并应用IN过滤器。

如果您没有确切的哈希键,请执行Scan,该操作确实有IN操作进行过滤。文档here

+0

这就是我的想法。我总是有散列键,目前的实现正是你上面所说的,我只是希望有一个更有效的本地方法。 –