Amazon dynamodb Dynamo DB,如何查询所有内容并利用排序键
我已经设置了一个索引,第二个排序键设置为我想要的(整数时间戳)。API一直抱怨我没有给它一个KeyConditionExpression。如果我给它一个,它说必须指定id。我试着强迫它使用id null给我所有的信息,但它仍然不能做到。这可能吗??如果迪纳摩不能完成这个简单的任务,也许是时候摆脱它了Amazon dynamodb Dynamo DB,如何查询所有内容并利用排序键,amazon-dynamodb,Amazon Dynamodb,我已经设置了一个索引,第二个排序键设置为我想要的(整数时间戳)。API一直抱怨我没有给它一个KeyConditionExpression。如果我给它一个,它说必须指定id。我试着强迫它使用id null给我所有的信息,但它仍然不能做到。这可能吗??如果迪纳摩不能完成这个简单的任务,也许是时候摆脱它了 看在上帝的份上,我所要做的就是查询整个表并让它使用我的排序键。几小时前,我就可以在SQL中使用它了。结果是,您还可以在扫描中添加索引名。这很有帮助。此外,如果使用排序键创建索引,则所有主索引必须完全
看在上帝的份上,我所要做的就是查询整个表并让它使用我的排序键。几小时前,我就可以在SQL中使用它了。结果是,您还可以在扫描中添加索引名。这很有帮助。此外,如果使用排序键创建索引,则所有主索引必须完全相同才能进行排序。首先,DynamoDB是一个NOSQL数据库,因此它不是SQL。也许您不应该期望能够执行您已经习惯的类似SQL的查询,并且因为这是两种完全不同的数据库类型而感到沮丧,每种数据库都有其优缺点 DynamoDB中的记录使用散列键进行分区,并且可以选择在每个分区内进行排序。 应该选取散列键,以便项目尽可能均匀地分布在分区上。分区的使用使得DynamoDB具有极高的可伸缩性和快速性。但是,如果您需要扫描所有项目并按排序顺序获取它们,那么您可能使用了错误的工具来完成此工作,或者您需要在客户端对项目进行排序 扫描操作将简单地遍历所有分区,从每个分区返回所有项目。此时,项目只能在各自的分区内进行排序
作为一个例子,考虑一组数据被划分为3个分区:
Partition A Partition B Partition B
Sort key Sort key Sort key
A D C
C E K
P G L
如您所见,您可以轻松地查询每个分区,并按排序顺序获取其中的项。但是如果你扫描的话,你可能会把项目分类为
[A,C,P,D,E,G,C,K,L],如果排序顺序是确定的。此时,您必须自己对项目进行排序
有时会看到的一个“技巧”是对所有项使用一个值相等的“伪”散列键,就像您在自己的答案中提到的那样。通过这种方式,您可以查询“dummy=1”,并根据排序键对项目进行排序。但是,这完全违背了散列键的目的,因为所有项都将放在同一个分区中,因此根本无法实现表的伸缩。但是,如果您发现自己使用DynamoDB,即使您有一个非常小的数据集,无论如何它都会工作。但是,对于这样一个小的数据集和用例,您可能首先应该使用另一个工具,例如RDS。只是为了详细说明@JHH。总的来说,我认为他是正确的,您不需要对DynamoDB中的所有元素进行排序。我还有一个类似的需求,因为我需要获取元素的顶部
N
数量,这些元素可能都在不同的分区中
DynamoDB确实有办法做到这一点,只是它不是现成的。我不认为说您需要SQL数据库是正确的,因为可以说您永远不会使用NoSQL数据库,因为您总是有这些限制之一。此外,如果您只对大型数据集使用NoSQL,那么您以后将不得不重新编写应用程序
那怎么办呢?您确实有一些选择,这取决于您的用例,让我们假设您至少在分区内进行了排序,这使它更容易。我们还假设您正在寻找最大值
- 最简单的方法是从每个分区中获取第一个值。并找出最大值。如果需要说出前10个值,您仍然可以使用此策略,但会变得太复杂
- 下一个选项是使用DynamoDB流。假设我们要保留前100个元素的列表。它们将在自己的顶级值分区上等待、排序并准备好即时检索。您需要自己维护此列表,方法是在插入或更新项目时检查项目是否大于第100个元素。如果是这种情况,您将把元素插入top-values分区,并删除最后一个值。我认为这是解决这个问题最可能的方法
希望这会有所帮助。IndexName所做的只是从索引而不是表中返回项。