当前位置: 首页 > 知识库问答 >
问题:

DynamoDB:查询所有数据并按日期降序排序

潘辰龙
2023-03-14

我是AWS DynamoDB的新手,需要这里专家的指导。

我正在创建一个应用程序,它将显示一个事件列表,条件是事件日期必须大于今天的日期,并按事件日期降序。我的表架构如下所示:

分区键=eventid

排序键=eventdate

如果我使用关系数据库,我可以使用“SELECT*From事件,其中eventdate

共有2个答案

宋和颂
2023-03-14

不幸的是,您无法使用查询API实现上述用例。

原因:-

>

在上面的用例中,您没有eventId,因此您不能使用Key条件表达式。即使您使用eventDate作为散列键创建GSI,您也不能在散列键上使用非等号操作符,并且除了Sort键之外的任何属性都无法进行排序。因此,您无法使用GSI选项实现排序要求。

针对上述用例使用查询API的解决方案:-

>

  • 使用散列键创建一个GSI作为eventDate

    使用查询API按eventDate

    在客户端按事件日期对数据进行排序。大多数编程语言都有良好的排序API。您可以在客户端轻松实现这一点

    注:-

    • 如果不知道主表的哈希键,就无法同时满足排序和使用查询API的要求

  • 乐正峰
    2023-03-14

    根据DynamoDB查询API文档:

    查询:

    查询操作使用表或辅助索引的主键直接访问该表或索引中的项。

    使用Key条件表达式参数为分区键提供特定值。查询操作将返回表或索引中具有该分区键值的所有项目。您可以通过在Key条件表达式中指定排序键值和比较运算符来选择缩小查询操作的范围。您可以使用ScanIndexForward参数按排序键以正序或逆序获取结果。

    关键条件表达式:

    指定要由Query操作检索的项的键值的条件。

    条件必须对单个分区键值执行相等性测试。该条件还可以对单个排序键值执行多个比较测试之一。查询可以使用KeyConditionExpression检索具有给定分区键值和排序键值的一个项,或者检索具有相同分区键值但不同排序键值的多个项。

    分区键相等测试是必需的,必须按以下格式指定:

    分区KeyName=:分区密钥

    如果还想为排序键提供条件,则必须使用和将其与排序键的条件结合使用。以下是将=比较运算符用于排序键的示例:

    partitionKeyName=:partitionkeyval和sortKeyName=:sortkeyval

    排序键条件的有效比较如下所示:

    • 如果排序键值等于:sortkeyval,则为true

    您可以选择使用ExpressionAttributeNames参数用占位符标记替换分区键和排序键的名称。如果属性名称与DynamoDB保留字冲突,则可能需要此选项。例如,以下KeyConditionExpression参数会导致错误,因为大小是保留字:

    Size = :myval
    

    要解决此问题,请定义一个占位符(例如#S)来表示属性名称大小。KeyConditionExpression如下所示:

    #S = :myval
    

    有关保留字的列表,请参阅《Amazon DynamoDB开发人员指南》中的保留字。

    如需详细了解ExpressionAttie teNames和ExpressionAttie teValue,请参阅Amazon DynamoDB开发人员指南中的属性名称和值使用占位符。

    类型:字符串

    必填项:否

    您的方案可以转换为以下代码:

    $tableName = "genericTable";
    $response = $dynamodb->query([
        'TableName' => $tableName,
        'IndexName' => 'OrderCreationDateIndex',
        'KeyConditionExpression' => 'partitionKeyName = :partitionkeyval AND sortKeyName = :sortkeyval',
        'ExpressionAttributeValues' =>  [
            ':partitionkeyval' => ['S' => 'pkey'],
            ':sortkeyval' => ['S' => 'sortkey']
        ],
        'Select' => 'ALL_PROJECTED_ATTRIBUTES',
        'ScanIndexForward' => false,
        'ConsistentRead' => true,
        'Limit' => 5,
        'ReturnConsumedCapacity' => 'TOTAL'
    ]);
    

     类似资料:
    • 问题内容: 我要显示的最后5个输入的特定ID数据。我的SQL查询是 是DATETIME 它显示按日期而非时间排序的最后5个条目。然后在同一日期按字母顺序排序。 假设我在同一日期有3个条目,并带有差异时间 比方说 查询以上查询后 我得到的是 按日期排序,然后按字母顺序 我想要的是这个.. 还按日期和时间排序… 问题答案: 如果要最后5行(以升序排列),则需要一个子查询: 第10次阅读问题后,这可能是

    • 因此,我有两个表,它显示的值类似于Facebook look-a feed。它们都有一个列,名为,但我希望它们按日期desc排序。 我认为加入是正确的方式(?),但不太确定。有人能帮帮我吗? 目前我在两个不同的查询中有它们: 而且 我该怎么做呢?

    • 我正在开发一个应用程序,该应用程序接收,带有,格式为。以下是JSON数据格式。 我想根据最新的时间戳对NOTNUMBER进行排序。我尝试了,也尝试了,但在静脉中。结果是升序。我希望日期戳以降序排序。我也尝试了使用,但不起作用。我想在这一天排序: 在使用过滤器参数时有点困惑。 请帮帮我。提前感谢

    • 我有一个解析模板,它将从appsync查询中获取开始日期作为日期。但我在迪纳摩的约会是有日期时间戳的。我们如何在没有时间的情况下比较这两个日期。以下是我的解析器模板查询:

    • 问题内容: 我想按日期订购。 例如 我已经尝试过: 伯,这是行不通的。 我得到这个代替: 你能帮我吗? 问题答案: 如果要按日期排序, 请将其存储为日期而不是字符串。 除非您的日期字符串的格式为,否则它不会按您希望的顺序排序。 数据库可以按原样进行足够的工作,而无需人们加倍努力,因此,您应该尽可能地避免我喜欢的 SQL体操。 将其存储为日期,然后(如果需要)使用日期函数以形式获取它。 这样会比您尝

    • 问题内容: 我知道这一定是相对简单的,但是我有一个JSON数据集,我想按日期排序。到目前为止,我无处不在遇到问题。现在,我将日期存储为。如果有帮助,我可以访问jquery,但是我意识到.sort()是本机JS。提前致谢。 问题答案: 假设您有一个javascript对象数组,只需使用自定义排序功能即可: Array 方法使用回调函数对数组进行排序,该回调函数传递给数组中的元素对。 如果返回值为负,