Amazon web services Dynamodb按排序顺序扫描

Amazon web services Dynamodb按排序顺序扫描,amazon-web-services,amazon-dynamodb,Amazon Web Services,Amazon Dynamodb,嗨,我有一张dynamodb桌子。我希望服务返回此表中的所有项目,并且顺序是按一个属性排序的 我需要为此创建全局二级索引吗?如果是这种情况,哈希键应该是什么,范围键应该是什么? (注意,对gsi的查询必须在gsi的哈希键上指定一个“EQ”比较器。) 非常感谢 Erben如果知道HashKey,那么任何查询都将返回按Range key排序的项。从: 查询结果始终按范围键排序。如果范围键的数据类型为Number,则结果将按数字顺序返回。否则,将按UTF-8字节的顺序返回结果。默认情况下,排序顺序为升

嗨,我有一张dynamodb桌子。我希望服务返回此表中的所有项目,并且顺序是按一个属性排序的

我需要为此创建全局二级索引吗?如果是这种情况,哈希键应该是什么,范围键应该是什么? (注意,对gsi的查询必须在gsi的哈希键上指定一个“EQ”比较器。)

非常感谢


Erben

如果知道HashKey,那么任何查询都将返回按Range key排序的项。从:

查询结果始终按范围键排序。如果范围键的数据类型为
Number
,则结果将按数字顺序返回。否则,将按UTF-8字节的顺序返回结果。默认情况下,排序顺序为升序。要颠倒顺序,请将
ScanIndexForward
参数设置为
false

现在,如果您需要返回所有项目,您应该使用扫描。您不能对扫描结果进行排序

另一种选择是使用GSI()。在这里,您可以看到GSI只包含HashKey。我猜结果将按此键的顺序排序(我还没有在程序中检查此部分!)。

到目前为止,dynamoDB扫描无法返回排序结果

您需要将查询与新的全局二级索引(GSI)一起使用,该索引带有hashkey和range字段。诀窍是使用哈希键,该哈希键为表中的所有数据分配相同的值

我建议为所有数据创建一个新字段,并将其称为“Status”,并将值设置为“OK”或类似值

然后,用于对所有结果进行排序的查询如下所示:

{
    TableName: "YourTable",
    IndexName: "Status-YourRange-index",
    KeyConditions: {
        Status: {
            ComparisonOperator: "EQ", 
            AttributeValueList: [ 
                "OK"
            ]
        }
    },
    ScanIndexForward: false
}

关于如何编写GSI查询的文档可以在这里找到:

我解决这个问题的方法是创建一个全局二级索引,如下所示。不确定这是否是最好的方法,但如果它对某人有用,就发布它

Hash Key                 | Range Key
------------------------------------
Date value of CreatedAt  | CreatedAt
HTTP API用户指定检索数据的天数的限制,默认为24小时


这样,我可以始终将HashKey指定为当前日期,RangeKey在检索时可以使用>和<运算符。这样,数据也会分布在多个碎片上

文档将ScanIndexForward描述为仅应用于查询操作,而不是扫描。我并没有看到文档说明这适用于扫描。通过GSI查询的结果将按GSI的范围键排序。我引用了一篇文章,结果是按范围键TopScore排序的。如果将ScanIndexForward参数设置为false,结果将按降序返回,因此首先返回最高分数。GSI没有什么特别之处。散列表通常是分散键的。@Sony Kadavan我创建了一个以“分区键+排序键”作为“主键”的表。现在,我想在分区键的帮助下检索所有项目。在这种情况下,我可以使用“扫描”吗?或者还有其他选择吗?@vardin你找到解决方案了吗?这是个糟糕的建议。DynamoDB表的性能特征也适用于GSIs。具有单个散列键“OK”的GSI将只使用一个分区。这将丢失DynamoDB的所有缩放特性。这是真的,结果将来自单个分区,但是如果与限制一起使用,那么它将是有效的。如果您限制为10项,您将按排序顺序获得前10项,这将不是一个昂贵的查询。(除了维护第二个GSI)因此,如果您只想显示列表中最近的项目,这是非常有效的。问题的作者没有说他的表中有多少项目,或者他想提供多少读取单元,但看起来即使是单个分区也可以相当舒适地支持1000个读取单元,最多可读取3000个单位。来源:@prestomation这不是什么可怕的建议。没错,它的伸缩性不好。但恰恰相反,考虑到限制条件(1000次写入/秒、3000次读取/秒、10 GB表大小),它可以维持一个非常经济高效的解决方案。糟糕的建议是盲目遵循最佳实践,远离现实世界的解决方案。这在功能上相当于仅使用1个碎片的“索引写入共享”。请参阅,这是中推荐的模式,它本身是一种类型的。