Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/95.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon dynamodb Dynamo DB,如何查询所有内容并利用排序键_Amazon Dynamodb - Fatal编程技术网

Amazon dynamodb Dynamo DB,如何查询所有内容并利用排序键

Amazon dynamodb Dynamo DB,如何查询所有内容并利用排序键,amazon-dynamodb,Amazon Dynamodb,我已经设置了一个索引,第二个排序键设置为我想要的(整数时间戳)。API一直抱怨我没有给它一个KeyConditionExpression。如果我给它一个,它说必须指定id。我试着强迫它使用id null给我所有的信息,但它仍然不能做到。这可能吗??如果迪纳摩不能完成这个简单的任务,也许是时候摆脱它了 看在上帝的份上,我所要做的就是查询整个表并让它使用我的排序键。几小时前,我就可以在SQL中使用它了。结果是,您还可以在扫描中添加索引名。这很有帮助。此外,如果使用排序键创建索引,则所有主索引必须完全

我已经设置了一个索引,第二个排序键设置为我想要的(整数时间戳)。API一直抱怨我没有给它一个KeyConditionExpression。如果我给它一个,它说必须指定id。我试着强迫它使用id null给我所有的信息,但它仍然不能做到。这可能吗??如果迪纳摩不能完成这个简单的任务,也许是时候摆脱它了


看在上帝的份上,我所要做的就是查询整个表并让它使用我的排序键。几小时前,我就可以在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分区,并删除最后一个值。我认为这是解决这个问题最可能的方法
因此,在NoSQL中,如果有某种查询,您可能会喜欢这样做,这在SQL中非常简单,而且您不能使用表/GSI/LSI,那么您几乎需要手动计算结果,并准备好使用它

现在,如果您不打算经常使用这些顶级值,那么您可以使用第一种方法,扫描每个分区的顶级值,直到得到您想要的列表,但是根据这些值在分区中的分布程度,这可能需要很多容量单元


希望这会有所帮助。

IndexName所做的只是从索引而不是表中返回项。